在这种情况下,我希望将资源字典中声明的字符串用作Text
属性上的绑定的一部分。仅绑定一个动态资源字符串不是问题:
<TextBlock Text="{DynamicResource keyToMyString}" />
但如果您需要在StringFormat上使用MultiBinding,则会很快遇到问题,因为您需要插入动态文本或想要组合多个字符串。例如,如果我的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>
我可以将指定资源文件中的string1
和string2
注入绑定文本,没有任何问题。但我找不到以同样的方式使用动态资源中的字符串的方法。 (我正在使用此方法将公司和产品名称从合并的资源字典中注入文本中。)
使用TextBlock我可以通过为TextBlock内容(Run)使用多个reference项来解决此问题:
<TextBlock >
<Run Text="{DynamicResource CompanyName}" />
<Run Text="{DynamicResource ProductName}" />
<Run Text="{DynamicResource MajorVersion}" />
</TextBlock>
但是当需要将动态资源绑定到Window Title属性时,这没有任何帮助。无论如何,通过使用现有的标记扩展(如x:Static
等)(创造性的,必要的)来实现这一目标?或者我们是否必须编写自己的标记扩展来实现这一目标?
答案 0 :(得分:2)
动态资源引用有一些值得注意的限制。必须至少满足下列条件之一:
- 正在设置的媒体资源必须是
FrameworkElement
或FrameworkContentElement
的媒体资源。该属性必须由DependencyProperty
支持。- 该引用适用于
内的值Style
Setter
。- 要设置的属性必须是
Freezable
上的属性,该属性是FrameworkElement
或FrameworkContentElement
属性或Setter
值的值。< / LI>
因此,如果使用Binding
,则会违反所有陈述。
如图所示,DynamicResourceExtension
适用于Run
类的实例,因为Run
类(至少)来自FrameworkContentElement
类。