我有一个WPF UserControls库和一个在库中共享的ResourceDictionary。
此库中的所有UserControl仅出现在单个“shell”父控件中,该控件实际上只是一组较小控件的容器。当我添加以下XAML
时,我能够按预期从我的shell控件访问ResourceDictionary<Control.Resources>
<ResourceDictionary Source="MyResources.xaml" />
</Control.Resources>
但是,我无法从位于“shell”控件内的子控件访问ResourceDictionary。
我的印象是WPF应该在本地检查资源,然后向上遍历,直到找到适当的资源?
相反,我正在
Cannot find resource named '{BoolInverterConverter}'.
Resource names are case sensitive. Error at
object 'System.Windows.Data.Binding' in markup file...
显然,我可以(和我)在我的子控件中引用ResourceDictionary;但现在每个控件都需要引用这个字典,我认为这不是必需的。
任何想法,我做的事情是奇怪还是我对行为的期望不正确?
答案 0 :(得分:5)
正在进行的是here,虽然文档有点不透明。如果在没有指定密钥的情况下向元素的ResourceDictionary
属性添加Resources
,则WPF希望您合并资源字典,并使用其{{1}中的字典内容填充字典。属性。它忽略MergedDictionaries
的实际内容,没有密钥。
所以你想做的是:
ResourceDictionary
修改强>
一个工作示例:
MainWindow.xaml:
<Control.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Control.Resources>
Dictionary1.xaml:
<Window x:Class="MergedDictionariesDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:MergedDictionariesDemo="clr-namespace:MergedDictionariesDemo" Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<MergedDictionariesDemo:UserControl1 />
</Grid>
</Window>
UserControl1.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="UCBrush"
Color="Bisque" />
</ResourceDictionary>