6

在这种情况下,我希望使用在资源字典中声明的字符串作为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项目来规避此问题:

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

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

4

1 回答 1

2

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

  • 设置的属性必须是 aFrameworkElement或上的属性FrameworkContentElement。该属性必须由DependencyProperty.
  • 引用是针对 a 中的值Style Setter
  • 要设置的属性必须是Freezable作为 aFrameworkElementFrameworkContentElement属性的值或值提供的 a 上的属性Setter

来源:XAML 资源、MSDN

因此,在使用 的情况下Binding,所有语句都被违反。

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

其他参考资料

  1. 资源部分:发生了什么第二部分:WPF 中的更多属性更改
  2. WPF:依赖属性和资源
于 2015-02-25T21:54:29.660 回答