如何在WPF应用程序中正确引用外部xaml样式?
我相信我的问题相当简单,但我很难成功地实现它。我只是希望提取WPF应用程序中元素的样式,因为xaml非常拥挤,而且xaml经常重复 因此,我希望将样式以资源字典的形式放在外部xaml文件中,然后在代码的参考资料部分引用该文件 我有以下.xaml文件:如何在WPF应用程序中正确引用外部xaml样式?,wpf,visual-studio,xaml,Wpf,Visual Studio,Xaml,我相信我的问题相当简单,但我很难成功地实现它。我只是希望提取WPF应用程序中元素的样式,因为xaml非常拥挤,而且xaml经常重复 因此,我希望将样式以资源字典的形式放在外部xaml文件中,然后在代码的参考资料部分引用该文件 我有以下.xaml文件: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.
<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>
如果我使资源成为动态的,那么这些样式就不会在运行时应用
我不确定xaml文件在运行时之前是否需要某些属性,但我的如下所示:
如果有人能回答这个谜,那就太好了。我在谷歌上搜索到手指流血,但其他人发布的答案都没有解决我的问题,这似乎很基本
编辑:已解决。按照Andrew Stephens的建议,将构建操作切换到页面而不是资源已经解决了我的问题。这被另一个潜在的问题所隐藏,那就是我在我的资源中添加了一个布尔到可见性转换器(公共工具)。仅此一项就可以了,但一旦我声明了一个资源字典,这个转换器也需要放在字典中。在开始引用xaml中的外部样式之前,请尝试使用新合并的字典构建解决方案 这似乎有悖常理,但VisualStudio可能知道另一个xaml文件中的某个类型,而设计师却不知道这可能会导致这样的错误
Koda这听起来像是某个地方的XAML语法错误,但也可能是由于主窗口代码隐藏中的未处理异常(如果这里有任何代码)引起的。有几种方法可以调试这个神秘的异常(阅读注释了解更多提示)
此外,您的.xaml资源文件的生成操作应为“页面”而不是“资源”。您的.xaml资源文件的生成操作应为“页面”而不是“资源”。感谢您的回复。我已经将构建操作更新为“Page”,但是仍然会发生解析错误。这听起来像是某个地方的XAML语法错误,但也可能是由主窗口代码中未处理的异常(如果您在这里有任何代码)引起的。有几种方法可以调试这个神秘的异常:(阅读评论获得更多提示)谢谢你给我指出这个网站,因为我相信它在将来会派上用场。不幸的是(我想)代码中没有错误。它成功初始化,然后当我正在开发的工具窗口开始打开时,会抛出xaml错误。谢谢你,安德鲁,看来你的解决方案解决了我的问题,只是隐藏在更多问题后面。请添加您的评论作为完整答案,我会将其标记为首选答案。我不确定我是否理解。我已经删除了ui元素本身对样式的引用,但保留了资源字典引用。它现在可以成功地构建和运行,但当然没有样式。但是,一旦我添加样式引用并再次运行它,它就会失败。这表明外部文件中存在xaml错误,但它看起来是完美的。
<UserControl.Resources>
<ResourceDictionary x:Key="PegasusStyles">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../../Resources/Styles/PegasusStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<TextBox Style="{StaticResource PTextBox}"/>
An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll