我在将控件特定资源(特别是Style
)添加到已定义合并ResourceDictionary
的控件时遇到问题。如果重要,我的XAML文件位于我正在工作的主项目的子文件夹中。
我开始时:
<controls:ChildWindow.Resources>
<Style x:Key="ParmatersText" TargetType="TextBlock">
<Setter Property="Margin" Value="5,5"/>
</Style>
</controls:ChildWindow.Resources>
但是当我添加它时遇到了问题:
<controls:ChildWindow.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="my.foo.bar;component/MyResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<Style x:Key="ParmatersText" TargetType="TextBlock">
<Setter Property="Margin" Value="5,5"/>
</Style>
</controls:ChildWindow.Resources>
错误消息为The designer does not support loading dictionaries that mix 'ResourceDictionary' items without a key and other items in the same collection.
此SO Question评分最高的答案告诉我尝试以下操作,这会改变</ResourceDictionary>
标记的位置。这个other SO question以及答案的链接支持了这种方法。
<controls:ChildWindow.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="my.foo.bar;component/MyResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style x:Key="ParmatersText" TargetType="TextBlock">
<Setter Property="Margin" Value="5,5"/>
</Style>
</ResourceDictionary>
</controls:ChildWindow.Resources>
然而,由于XamlParseException导致Failed to assign to property 'System.Windows.ResourceDictionary.Source'
从同样的问题,我尝试了明确的答案,这给了我这个:
<controls:ChildWindow.Resources>
<ResourceDictionary x:Key="MyDictionary">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="my.foo.bar;component/MyResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<Style x:Key="ParmatersText" TargetType="TextBlock">
<Setter Property="Margin" Value="5,5"/>
</Style>
</controls:ChildWindow.Resources>
然而,与之前相同的XamlParseException失败了。
XAML Resources和Merged Resource Dictionaries上的这两篇MSDN文章帮助我理解了页面所隐含的ResourceDictionary
,我显然是通过在隐式字典中定义资源来创建冲突以及指定的合并。
我的问题是上面的语法不起作用,我正在拿起XamlParseExceptions。
答案 0 :(得分:0)
所以我终于找到了问题的解决方案,我认为部分原因是由于我的文件位于子文件夹中。
在子窗口的声明中,我添加了以下命名空间:
<controls:ChildWindow xmlns:local="clr-namespace:my.foo.bar" >
并且参考资料部分的正确语法是:
<controls:ChildWindow.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style x:Key="ParmatersText" TargetType="TextBlock">
<Setter Property="Margin" Value="5,5"/>
</Style>
</ResourceDictionary>
</controls:ChildWindow.Resources>
这非常接近来自链接的SO问题的答案,但在命名空间的元素中添加以识别资源文件。