2013-07-02 25 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之间有一些主要的区别,它们会改变你解决问题的方式。 –