2011-05-16 157 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

相關問題