从WPF UserControl访问ResourceDictionary

8
我正在尝试通过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个回答

8

要在代码后台访问您的UserControl的XAML资源,您只需要访问UserControl的Resources属性。像这样:

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

虽然,首选方法是使用FindResource()函数,它会在整个逻辑树中搜索与关键字匹配的内容,而不仅仅是调用它的对象。

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

2
尝试去掉您位置前面的斜杠。只有在必须先进入库时,才应使用/Resources,例如 ../Resources。
<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
           <ResourceDictionary Source="Resources/BiometricDictionary.xaml" />                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

希望这能为您提供帮助。

0

所以,您在UserControl的程序集中定义了一个ResourceDictionary,并希望从该UserControl的代码后台访问它?

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

希望这有所帮助!


0

哎呀...在将代码编译到本地 bin 目录以便引用相对路径后,我实现了在这里找到的打包 URI 解决方案:单独程序集中的 ResourceDictionary 然后使用 FindResource(x:key value here) 方法。

@PeterAllenWeb, @Pwninstein,感谢你们的快速回复和再次激发我的思考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接