【问题标题】:How to correctly reference external xaml styles in a WPF application?如何在 WPF 应用程序中正确引用外部 xaml 样式?
【发布时间】:2017-09-25 16:05:03
【问题描述】:

我相信我的问题相当简单,但我很难成功实施它。我只是想在我的 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 文件在运行时是否需要某些属性,但我的如下:

如果有人能解答这个谜,那就太好了。我用谷歌搜索直到我的手指流血,但其他人发布的答案都没有解决我的问题,这似乎非常初级。

编辑:已解决。按照 Andrew Stephens 的建议,将构建操作切换到 Page 而不是 resource 已解决了我的问题。这被另一个潜在问题所隐藏,即我在资源中添加了一个布尔到可见性转换器(通用工具)。仅此一项就可以了,但是一旦我声明了一个资源字典,这个转换器也需要被带入字典中。

【问题讨论】:

  • .xaml 资源文件的 Build Action 应该是“Page”而不是“Resource”。
  • 感谢您的回复。我已将构建操作更新为“页面”,但仍然出现解析错误。
  • 这听起来像是某处的 XAML 语法错误,但也可能是由主窗口代码隐藏中未处理的异常引起的(如果您在此处有任何代码)。有几种方法可以调试这个神秘的异常:geekswithblogs.net/lbugnion/archive/2007/03/14/108728.aspx(阅读 cmets 了解更多提示)
  • 感谢您将我指向此站点,因为我相信它将来会派上用场。不幸的是(我想)后面的代码没有错误。它初始化成功,然后当我正在开发的工具窗口开始打开时,就会抛出xaml错误。
  • 谢谢安德鲁,看来您的解决方案确实解决了我的问题,只是隐藏在更多问题后面。请将您的评论添加为完整答案,我会将其标记为首选答案。

标签: wpf visual-studio xaml


【解决方案1】:

这听起来像是某处的 XAML 语法错误,但也可能是由主窗口代码隐藏中的未处理异常引起的(如果您在此处有任何代码)。有几种方法可以调试这个神秘的异常here(阅读 cmets 了解更多提示)

.xaml 资源文件的 Build Action 也应该是“Page”而不是“Resource”。

【讨论】:

    【解决方案2】:

    在开始引用 xaml 中的外部样式之前,请尝试使用新合并的字典构建解决方案。

    这似乎违反直觉,但 Visual Studio 有可能知道另一个 xaml 文件中的类型,而设计者却不知道这会导致此类错误。

    柯达

    【讨论】:

    • 我不确定我是否理解。我已经删除了对 ui 元素本身样式的引用,但保留了资源字典引用。它现在可以成功构建和运行,但当然没有样式。但是,一旦我添加样式引用并再次运行它就会失败。这表明外部文件中存在 xaml 错误,但它看起来完美无缺。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-03-31
    相关资源
    最近更新 更多