从WPF UserControl访问ResourceDictionary

时间:2009-06-02 17:39:04

标签: c# wpf xaml resourcedictionary

我正在尝试通过C#访问UserControl代码隐藏中的资源字典,但我收效甚微。

合并词典:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Resources/BiometricDictionary.xaml" />                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

嵌入字典:

<UserControl.Resources>
    <BitmapImage x:Key="imageDefault">/Resources/Images/default_thumb.png</BitmapImage>
    <BitmapImage x:Key="imageDisconnected">/Resources/Images/disconnect_thumb.png</BitmapImage>
    <BitmapImage x:Key="imageFailed">/Resources/Images/failed_thumb.png</BitmapImage>
    <BitmapImage x:Key="imageSuccess">/Resources/Images/success_thumb.png</BitmapImage>
</UserControl.Resources>

代码背后:

        var resourceDictionary = new ResourceDictionary();
        resourceDictionary.Source = new Uri("/Resources/BiometricDictionary.xaml", UriKind.Relative);

我已经尝试了所有的例子和有用的提示,但很快就会出现。现在,成功将是加载字典的能力。有什么建议?

4 个答案:

答案 0 :(得分:7)

要访问代码隐藏中的一个UserControl XAML资源,您只需访问UserControl的Resources属性即可。像这样:

BitmapImage myImage = (BitmapImage)this.Resources["imageDefault"];

但是,首选方法是使用FindResource(),它将搜索整个逻辑树以匹配键,而不仅仅是调用它的对象。

BitmapImage myImage = (BitmapImage)this.FindResource("imageDefault");

答案 1 :(得分:1)

尝试删除您所在位置的正斜杠。你唯一应该使用/ Resources的是你必须先上一个图书馆。喜欢../资源

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
           <ResourceDictionary Source="Resources/BiometricDictionary.xaml" />                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

希望这会对你有所帮助。

答案 2 :(得分:0)

那么,你在UserControl的程序集中定义了一个ResourceDictionary,并希望从UserControl的代码隐藏中访问它吗?

你应该能够。但是,如果您列出的代码位于构造函数中,则可能无法访问资源字典(可能尚未加载)。尝试将相同的代码添加到UserControl的“已加载”事件中,并查看是否有效。如果您只是尝试访问资源(例如样式或模板),则直接使用“FindResource”或“TryFindResource”函数也应该可以正常工作(即您不会需要一个“ResourceDictionary”类型的对象。

希望有所帮助!

答案 3 :(得分:0)

d'Oh ...在编译到本地bin之后,引用是相对的,我实现了这里找到的包URI解决方案:ResourceDictionary in a separate assembly然后是FindResource(x:这里的键值)。

@PeterAllenWeb,@ Pwninstein,感谢您的快速反应并让我重新思考。