基于主题在WPF / XAML中显示不同的图像

时间:2013-04-22 09:30:52

标签: wpf xaml

我的问题看起来很简单:我的主页上有一个视图框,根据所选主题(theme1或theme2),我想显示相应的图像(WhiteImage或BlackImage,在资源下myImages.xaml中定义为SVG画布)

这就是我认为我能做到的:

<Viewbox x:Name="myCustomImage"
VerticalAlignment="Top"
Height="24"
Margin="0,0,10,0"
Child="{StaticResource myImage}" />

然后我尝试在theme1.xaml(和theme2.xaml类似)中定义canvas myImage,如下所示:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:myApp">

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="../Resources/myImages.xaml" />
    </ResourceDictionary.MergedDictionaries>

    ...
    <Color x:Key="myForegroundcolor">#FF63398F</Color>  
    ...
    <Canvas x:Key="myImage">WhiteImage</Canvas>

</ResourceDictionary>

抛出错误消息 - “String”类型的值无法添加到“UI ElementCollection”类型的集合或字典中。

这首先是正确的做法吗?如果是,我该如何解决此错误?

编辑:我遵循了Dean的建议(谢谢)。这就是我所做的:

更改了resourcetheme1.xaml,如下所示:

<Canvas x:Key="myImage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Width="200"
        Height="100">
    <ContentControl Content="{StaticResource WhiteImage}" />

    <Canvas>
        <Canvas>
            <Path Fill="#FFFFFFFF"
                    Data=... />         
            <Path Fill="#FFFFFFFF"
                    Data=... />
        </Canvas>
    </Canvas>
</Canvas>

更改了mainpage.xaml,如下所示:

<Viewbox x:Name="myViewbox"
...
Height="32"
Child="{StaticResource WhiteImage}" />

为.cs添加了依赖项属性: ...

public Canvas myImage
{
    get
    {
        return (Canvas)GetValue(myImageProperty);
    }
    set
    {
        SetValue(myImageProperty, value);
    }
}

现在我在mainpage.xaml中的这行上得到了一个不同的错误Child =“{StaticResource WhiteImage}”/&gt; - 在System.Windows.StaticResourceExtension上提供值抛出异常 - 找不到名为WhiteImage的资源。当我将xaml更改为myImage btw时,我得到了同样的错误。谢谢你的帮助。在相关的说明中,我发现很难相信它是如此复杂 - 我想要做的就是:如果theme = black viewbox.child = whiteImage else viewbox.child = blackimage。

1 个答案:

答案 0 :(得分:1)

您正在使用字符串作为Canvas的子项。你需要声明像这样的孩子

<Canvas x:Key="myImage">
   <ContentControl Content="{StaticResource WhiteImage}" />
</Canvas>