【问题标题】:Is it possible to use a DynamicResource in a MultiBinding at all?是否可以在 MultiBinding 中使用 DynamicResource?
【发布时间】:2013-06-02 12:07:06
【问题描述】:

在这种情况下,我希望使用资源字典中声明的字符串作为Text 属性绑定的一部分。仅绑定单个动态资源字符串不是问题:

<TextBlock Text="{DynamicResource keyToMyString}" />

但是如果您需要在MultiBinding 上使用StringFormat,您很快就会遇到问题,因为您需要插入动态文本或想要组合多个字符串。例如,如果我的 MultiBinding 如下所示:

<TextBlock.Text>
    <MultiBinding StringFormat="{}{0} {1} some more text">
        <Binding Source="{x:Static Resources:Strings.string1}" />
        <Binding Source="{x:Static Resources:Strings.string2}" />
    </MultiBinding>
<TextBlock.Text>

我可以将指定资源文件中的string1string2 注入到绑定文本中,没有问题。但是我找不到以相同方式使用动态资源中的字符串的方法。 (我正在使用这种方法将公司和产品名称注入到合并资源字典中的文本中)。

使用TextBlock,我可以通过对TextBlock 内容使用多个Run 项目(reference) 来规避这个问题:

<TextBlock >
    <Run Text="{DynamicResource CompanyName}" />
    <Run Text="{DynamicResource ProductName}" />
    <Run Text="{DynamicResource MajorVersion}" />
</TextBlock>

但是当需要将动态资源绑定到Window Title 属性时,这无济于事。有没有办法通过(创造性的,如有必要)使用现有的标记扩展(如x:Static等)来实现这一点?还是我们必须编写自己的标记扩展来实现这一点?

【问题讨论】:

标签: wpf multibinding markup-extensions dynamicresource


【解决方案1】:

动态资源引用有一些明显的限制。以下至少一项必须为真:

  • 要设置的属性必须是FrameworkElementFrameworkContentElement 上的属性。该属性必须由 DependencyProperty 支持。
  • 引用是针对Style Setter 中的值。
  • 要设置的属性必须是Freezable 上的属性,该属性以FrameworkElementFrameworkContentElement 属性的值或Setter 值的形式提供。

Source: XAML Resources, MSDN.

因此,如果使用Binding,则违反了所有声明。

如图所示,DynamicResourceExtension 对于Run 类的实例工作得很好,因为Run 类(至少)是从FrameworkContentElement 类派生的。

其他参考

  1. 资源部分:Wha' Happened Part Two: More Property Changes in WPF
  2. WPF: Dependency Properties & Resources

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 2020-09-18
    • 2013-03-23
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2010-12-24
    • 2017-12-18
    • 2015-09-03
    相关资源
    最近更新 更多