如何从C#代码访问wpf中的ResourceDictionary?

Emb*_*rja 58 c# wpf resources

DataTemplate在xaml文件中定义了我想通过C#代码访问的文件.任何人都可以告诉我如何访问它?我添加了一个新ResourceDictionary文件,它的名字是Dictionary1.xaml.我有一个数据模板,如:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <DataTemplate x:Key="mytemplate">
        <TextBlock Text="Name:" Background="Blue"/>
    </DataTemplate>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

不是我有一个ListBox名为listBox1,我想将它分配给它的Itemtemplate属性,但我不知道怎么办呢?

its*_*sho 58

因为Application.Current在我的情况下是空的,我最终使用了这个:

    var myResourceDictionary = new ResourceDictionary();
    myResourceDictionary.Source =
        new Uri("/DllName;component/Resources/MyResourceDictionary.xaml",
                UriKind.RelativeOrAbsolute);  
Run Code Online (Sandbox Code Playgroud)

然后通过使用获取我需要的指定密钥 myResourceDictionary["KeyName"] as TypeOfItem

(来源)

  • 我个人认为这是最好的方法,就好像你要在一个库或任何地方定义它,它仍然可以工作,在接受的答案中,你必须将所有字典合并到你的应用程序中,这可能是一种过度杀伤,或者不可行. (4认同)
  • 如果字典不在不同的程序集中,`";component/Styles/Icons.xaml"` 也足够了。 (4认同)

Szy*_*zga 54

你究竟在哪里定义它?

如果您在对象的ResourceDictionary中定义它,那么

Application.Current.Resources[typeof(yourDataTemplateTargetType)] 
Run Code Online (Sandbox Code Playgroud)

应该管用.如果您将其定义为其他内容的成员(例如,一个ItemsControl),则需要获取ItemsControl实例的句柄并调用ItemTemplate属性.

编辑:好的,我想我们到了某个地方.所以你要在自己的文件中定义一个ResourceDictionary.在您可以在UI中使用它并从后面的代码访问它之前,您需要将该ResourceDictionary合并到您的应用程序中.你在做这个吗?

如果是,那么下一步就是获取此资源.每个FrameworkElement都有一个名为FindResource的方法.这种方法很棒,因为它遍历ResourceDictionary树并尝试使用密钥定位资源.因此,如果要从UserControl访问此资源,可以在后面的代码中执行以下操作:

FindResource(typeof(yourDataTemplateTargetType));
Run Code Online (Sandbox Code Playgroud)

如果这对您不起作用,请告诉我们您如何声明此资源字典以及它如何合并到您的应用程序资源中.

  • 我不明白.这个答案不使用密钥. (2认同)

Jak*_*sen 7

例如,如果您在App.xaml文件的资源字典中有Button模板,则可以使用以下代码访问它:

Application.Current.Resources[typeof(Button)]
Run Code Online (Sandbox Code Playgroud)