我在public
方法中有以下代码,但是如何在静态方法中使用它? o
是static TextBox
?
Invoke((MethodInvoker)delegate {
o.Text = str + Environment.NewLine;
});
我已经阅读了System.Reflection
命名空间中的MethodInfo类,但似乎没有任何工作。只是为了告诉你,我想要一些能做到这一点:
public static void writeOut(string str)
{
Invoke((MethodInvoker)delegate {
o.Text = str + Environment.NewLine; // runs on UI thread
});
}
该代码不起作用,但我想知道如何在静态方法中调用invoke
,如上面的代码片段。
答案 0 :(得分:1)
您问题的直接答案是使用o.Invoke()
方法:
public static void writeOut(string str)
{
o.Invoke((MethodInvoker)delegate {
o.Text = str + Environment.NewLine; // runs on UI thread
});
}
即。假设o
在此上下文中是有效的标识符,并假设它确实引用了TextBox
对象,那么您只需调用TextBox
对象{{1方法。
尽管如此,我同意这些评论,指出在表单中对控件实例进行Invoke()
引用是一个真的坏主意。它是一个hack,意味着你只能拥有一个表单实例,这意味着它依赖于在实例方法中正确初始化static
字段(例如构造函数)。
如果您必须拥有static
引用,请将其设置为表单对象本身。更好的是,将表单对象引用传递给需要处理它的任何对象。在你的问题中,我没有足够的背景来建议究竟是什么样子,但基本的想法是只为那些真正静态的东西制作static
,即根本不相关的东西。可以多次实例化的类型。
至于学习WPF的建议去......
WPF肯定是一个进步并值得学习,但它比Winforms更陡峭。 Winforms有一个简单的控制对象和事件驱动模型,其中引入了一些最小的数据绑定功能.WPF在很大程度上依赖于强大的关注点分离"编程方法,数据绑定和使用完全不同的语言来定义UI本身(即XAML)。这些方法非常有用,如果正确实现,将会产生更好,更易维护的代码。但是学习使用它们需要做更多的工作,而且WPF API本身非常复杂,并且在许多方面没有明确的单一选择来实现某些东西。