我相信我的问题相当简单,但我很难成功实施。我只想在我的WPF应用程序中提取元素的样式,因为xaml相当拥挤而且xaml经常被复制。
因此,我希望将样式放在外部xaml文件中,以资源字典的形式,然后在我的代码的资源部分中引用该文件。
我有以下.xaml文件:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="PTextBox" TargetType="TextBox" x:Name="PTextBox">
<Setter Property="Foreground" Value="#FFA1C8E7"/>
<Setter Property="BorderBrush" Value="#FFA1C8E7"/>
</Style>
我在这里引用字典:
<UserControl.Resources>
<ResourceDictionary x:Key="PegasusStyles">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../../Resources/Styles/PegasusStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
Visual Studio已经解析了文件位置,所以我知道这个引用是正确的。
应用样式的文本框然后引用样式:
<TextBox Style="{StaticResource PTextBox}"/>
如果保留为静态资源,我会得到一个xaml解析错误,如下所示:
An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll
如果我使资源动态化,那么样式就不会在运行时应用。
我不确定xaml文件在运行时是否需要某些属性,但我的如下:
如果有人能回答这个谜团,那就太好了。我用谷歌搜索,直到我的手指流血,但其他人发布的答案都没有解决我的问题,这似乎非常简陋。
编辑:解决了。将构建操作切换到Page而不是资源已经解决了Andrew Stephens所建议的问题。这已被另一个潜在问题所隐藏,即我已经为我的资源添加了一个布尔到可见性转换器(常用工具)。仅此一点就可以了,但是一旦我宣布了一个资源字典,这个转换器也需要被带入字典中。答案 0 :(得分:1)
这听起来像某个XAML语法错误,但也可能是由主窗口代码隐藏中的未处理异常引起的(如果这里有任何代码)。有几种方法可以调试这个神秘异常here(阅读评论以获取更多提示)
您的.xaml资源文件的Build Action也应该是“Page”而不是“Resource”。
答案 1 :(得分:0)
在开始引用xaml中的外部样式之前,尝试使用新合并的字典构建解决方案。
它可能看起来反直觉但是Visual Studio可能会知道另一个xaml文件中的类型,而设计人员并不知道哪个类型会导致这样的错误。
幸