2011-05-16 159 views
0

我有一个TextBlock控制,我声明性地将Text属性设置为{loc:Translate}以编程方式设置WPF属性

<TextBlock x:Name="Message" Text="{loc:Translate}" loc:TranslateExtension.Uid="myMessage" /> 

在运行时,我将Text属性值更新为其他值。然后我需要将它重置为{loc:Translate}

我的问题是,如何以编程方式将Text设置为{loc:Translate}

回答

2

当XAML处理器处理一个类型的节点和构件值是标记扩展,它调用该标记扩展的ProvideValue方法和将结果写入到对象图或序列化流。 XAML对象编写器通过serviceProvider参数将服务上下文传递给每个此类实现。

tb.Text = new TranslateExtension().ProvideValue(null) as string; 

这应该是她,只不过这是缺乏 '适当的' IServiceProvider -parameter。

在典型的用法中,.NET Framework XAML Services和实现的XAML对象编写器将为在XAML处理期间调用的所有值转换器方法提供服务提供者。但是,为了健壮性,您应该为服务提供者本身和任何请求的服务提供空值的代码路径。如果您的标记扩展应用于由XAML解析器基础结构提供的典型服务支持不可用的某些情况下,则可能会发生空值。

因此,根据您的扩​​展实施,您实际上可以将null传递给ProvideValue

+0

感谢您的解释。绝对帮助我理解发生了什么,但是我的扩展实现不会除了一个空的'IServiceProvider'。我可能会寻找一个不同的工作来实现我想要实现的目标,可能使用两个“TextBlock”并更改其可见性而不是“文本”。 谢谢! – Sio 2011-05-16 23:04:24

+0

在MSDN上有很多东西可以找到,例如[本文](http://msdn.microsoft.com/en-us/library/ee621338.aspx)可能会帮助您使用服务提供者。我引用的['ProvideValue'-Documentation](http://msdn.microsoft.com/en-us/library/system.windows.markup.markupextension.providevalue.aspx)也是非常丰富的。但是它可能是一个持续存在的问题,MarkupExtensions顾名思义仅仅是XAML标记本身,所以没有在代码背后使用它的正确方法。 – 2011-05-16 23:12:46

相关问题