2013-07-02 53 views
0

目前我正在將我的一個程序從WinForms轉換爲WPF。我遇到的第一個問題涉及到在WPF中設置控件的文本值。在我的WinForms項目,我已經工作的代碼看起來像這樣:WPF中的Control.Text

delegate void SetTextCallback(Control c, string text); 

private void SetText(Control c, string text) 
{ 
    if (c.InvokeRequired) 
    { 
     SetTextCallback d = new SetTextCallback(SetText); 
     this.Invoke(d, new object[] {c, text}); 
    } 
    else 
    { 
     c.Text = text; //This is where I have not found a way to replicate. 
    } 
} 

我已經改變了一些事情讓一部分工作,但到目前爲止,這是我在WPF中,似乎除了工作我實際上試圖設置控件文本的部分。

delegate void SetTextCallback(Control c, string text); 

private void SetText(Control c, string text) 
{ 
    if (c.Dispatcher.CheckAccess()) 
    { 
     SetTextCallback d = new SetTextCallback(SetText); 
     this.Dispatcher.Invoke(d, new object[] {c, text}); 
    } 
    else 
    { 
     c.Text = text; 
    } 
} 

從我在這個網站和MSDN段閱讀的東西后發現是,我可以調用c.Text命令,如果控制得特別WPF的文本框,然後c.Content命令,如果控制是特別的WPF標籤。但是,我不能像我這裏那樣調用其中的任何一個通用控件。是否有任何方法或命令可以用來設置我的控件c的Text值,還是有另一種方法可以修改代碼,以便我仍然可以設置SetText函數,該函數允許我編輯任何文本用相同的方式控制(文本框,標籤等)?

回答

1

WPF中有多種不同的內容模型。 MSDN對他們有很好的啓示。

話雖如此,你可以用DependencyProperty做一件很酷的事情,它可以設置在DependencyObject上,它可能不關心它。因此,您可以這樣做:

c.SetValue(TextBlock.TextProperty, text); 
c.SetValue(ContentControl.ContentProperty, text); 

這將覆蓋顯示內容的大多數控件。

+0

@ VarnerBeast14對不起,我用正確的靜態字段更新了答案。我忘了在最後添加該屬性。 'ContentControl'和'TextBlock'都在'System.Windows.Controls'中。我也錯了,你可以設置TextElement.TextProperty,因爲TextElement只定義了文本格式屬性,而不是它們的內容屬性。 –

+0

我現在擁有它。我不確定它是否會像我需要的那樣工作,但至少它沒有錯誤地接受它。如果它有效,我會回來並將其標記爲答案。 – VarnerBeast14

+0

@ VarnerBeast14我應該指出的一點是,因爲你傳遞了'Control',所以你將永遠不會有'TextBlock',因爲它是從'FrameworkElement'派生出來的。你真的可能想問一個關於你想要完成的事情的問題,而不是你特定的實現細節。 WPF和WinForms之間有一些主要的區別,它們會改變你解決問題的方式。 –