【问题标题】:binding DynamicResource to BasedOn Style将 DynamicResource 绑定到 BasedOn 样式
【发布时间】:2012-09-11 12:45:21
【问题描述】:

我的要求是在具有以下情况的文本框上应用多种样式:

  1. 我在另一个文件中有一种样式(例如 MyTextStyle),例如“Generic.xaml
  2. 我的文本框在 ABC.xaml
  3. 我想对这个文本框应用一些触发器,所以我必须使用 Textbox.Style
  4. 我也想申请“MyTextStyle

当我执行以下操作时,我无法将 DynamicResource 应用于 BasedOn:

<TextBox.Style>
                    <Style BasedOn="{DynamicResource MyTextStyle}" TargetType="{x:Type TextBox}">
                        <Setter Property="Text" Value="{Binding SelectedCall.Name}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding SelectedCall.Name}" Value="N/A">
                                <Setter Property="Text" Value="" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>

请建议我一些解决方案,以便我可以应用此动态资源以及我的数据触发器样式

【问题讨论】:

  • 为什么要在 BasedOn 中使用 DynamicResource 而不是 StaticResource?
  • 因为样式“MyTextStyle”用于我的解决方案中的几乎所有文本框。因此,如果我为此文本框目的专门(并且在本地)定义它,那将是多余的。

标签: wpf xaml


【解决方案1】:

DynamicResource 更改为StaticResource,如下所示:

<Style BasedOn="{StaticResource MyTextStyle}" TargetType="{x:Type TextBox}">

在 BasedOn 中故意不允许使用 DynamicResource。

编辑: 你得到“找不到名为'EmptyTextBoxStyle'的资源”,因为应用程序找不到这个特定的静态资源。为了帮助应用程序找到它,您需要使用 MergedDictionary。这是如何在内部使用它的示例,例如窗口:

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Generic.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

在另一个 ResourceDictionary 中,你应该像下面这样使用它:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>

您需要以这种方式引用包含 EmptyTextBoxStyle 样式定义的 ResourceDictionary。因此,例如,如果在 Generic.xaml 文件中声明了“EmptyTextBoxStyle”,并且您在 ABC.xaml 中使用它,则可以只使用上面的 XAML(当然,您需要根据项目结构更新 Source 属性)。

【讨论】:

  • 我也试过这个。但它会引发运行时异常。抱歉,现在我无法向您展示我遇到的异常。会再试一次,明天告诉你。
  • 发生以下异常:“合成产生了单个合成错误。下面提供了根本原因。查看 CompositionException.Errors 属性以获取更多详细信息。1) 找不到名为“EmptyTextBoxStyle”的资源。资源名称区分大小写”。并且名称正确(即“EmptyTextBoxStyle”拼写正确)
  • 嗨。谢谢。实际上,在我的解决方案中,ResourceDictionary 被添加到控制器的构造函数之一中,并且在初始化此 ABC.xaml 后调用该构造函数。无论如何,它工作得很好。非常感谢
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 2018-12-08
  • 2010-10-13
  • 1970-01-01
相关资源
最近更新 更多