WPF - 将C#中的资源字典插入XAML

时间:2017-04-28 12:05:37

标签: c# wpf xaml dictionary

通过这种方式,我可以在 C#代码中访问 XAML资源

var resource = new ResourceDictionary
{
    Source = new Uri("/myAssemblyName;component/Themes/MyStyle.xaml", UriKind.RelativeOrAbsolute)
};

我在想一个反向的方法。我想在 C#代码中定义资源字典,如下所示:

public class MyColors : ResourceDictionary
{
    public MyColors ()
    {
        this.Add("MyGreen", Color.FromRgb(10, 211, 12)); // this["MyGreen"] = Color.FromRgb(10, 211, 12);
    }
}

然后将此资源字典包含在 XAML样式文件中,如下所示:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="MyColors.cs" />
    </ResourceDictionary.MergedDictionaries>

    <SolidColorBrush x:Key="MyGreenBrush" Color="{StaticResource MyGreen}" />
</ResourceDictionary>

问题是将资源字典包含到XAML文件中的可能性。因为提出的方法不起作用 - 错误:意外的项目文件类型在... \ MyColors.cs

2 个答案:

答案 0 :(得分:1)

您需要在MergedDictionaries

中构建您创建的类
<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <yourClassXmlNamespace:MyColors/>
    </ResourceDictionary.MergedDictionaries>

    <SolidColorBrush x:Key="MyGreenBrush" Color="{StaticResource MyGreen}" />
</ResourceDictionary>

答案 1 :(得分:0)

你应该在XAML中构建字典

这将如下所示

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:WPF_ScratchPad">
    <Color x:Key="MyGreen">#0ad30c</Color>
</ResourceDictionary>

然后你正确地做了你合并控制字典

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MyColors.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

如果您确实需要在代码中创建字典,那么您可以将其合并如下

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <yourxmlns:MyColors/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

一旦将字典添加到控件中,您就不需要实例化字典的单独实例来访问它,而只需调用TryFindResource,因为这样可以保持覆盖结构的完整性