如何在扩展/方法文件中使用调用方法?
好吧,我正在编写一个对字符串、标签、链接标签、类等有用的扩展/方法文件。
但是,我有一个问题。我有一个 showMessage()
方法可以更改标签的文本,工作正常。但我决定通过线程执行来实现这一点,然后我这样做:
namespace LabelExtensions
{
public static class LabelExtensionsClass
{
private delegate void UpdateState();
public static void ShowMessage(this Label label, string text)
{
if (label.InvokeRequired)
{
label.Invoke((UpdateState)delegate
{
label.Text = text;
});
}
else
{
label.Text = text;
}
}
}
}
抱歉,这是一个拼写错误。我在论坛上输入了这段代码。 错误继续。
根据文档,要使用Invoke方法需要导入:
命名空间: System.Windows.Forms
程序集: System.Windows.Forms(在 System.Windows.Forms.dll 中)
然后我做了:
using System.Windows.Forms;
但这返回相同的错误:
The name 'Invoke' does not exist in the current context
我如何解决这个问题?
提前致谢。
Well, I'm writing a file of extensions/method useful to strings,label,linklabels,class etc.
but, I have a problem. I have an showMessage()
method that change the Text of label, works fine. But I decide to do that works with thread execution, then I do this:
namespace LabelExtensions
{
public static class LabelExtensionsClass
{
private delegate void UpdateState();
public static void ShowMessage(this Label label, string text)
{
if (label.InvokeRequired)
{
label.Invoke((UpdateState)delegate
{
label.Text = text;
});
}
else
{
label.Text = text;
}
}
}
}
sorry, it was a typo. I typed this code on forum.
the error continue.
according the documentation,to use the Invoke method need to imports:
Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)
then I did:
using System.Windows.Forms;
but this returns same error:
The name 'Invoke' does not exist in the current context
how I fix this?
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
为什么不这样做:
不需要创建自己的委托。只需使用内置的 Action 委托即可。您可能应该为基 Control 类创建扩展方法,而不是标签类。它将更加可重复使用。
Why not just do this:
There is no need to create your own delegate. Just use the built-in Action delegate. You should probably create your extension method for the base Control class instead of the Label class. It'll be more reusable.
更改
为
Change
to
您忘记在代码中指定标签(当您调用 Invoke 方法时):
另外,请考虑使用 BeginInvoke 代替,这样您就不会阻塞调用线程(如果适用)
You forgot to specify the label in your code (when you call the Invoke method):
also, consider using BeginInvoke instead so you won't block the calling thread (if applicable)
Invoke
是Control
的实例方法。您需要一个
Control
来调用它,例如您的标签
。Invoke
is an instance method ofControl
.You need a
Control
to call it on, such as yourlabel
.您不需要声明新的委托类型,或构造新的 lambda 或匿名委托。您已经拥有一种作用于 UI 线程的方法 - 您正在编写的方法。如果需要的话,只需让它在 UI 线程上调用自身,就像这样。
这种方法的优点是,您几乎可以将此方法中的重定向代码块复制并粘贴到您想要以相同方式修改的任何其他方法中。
You don't need to declare a new delegate type, or construct a new lambda or anonymous delegate. You already have a method that acts on the UI thread - the one you are writing. Just make it call itself on the UI thread if needed, like this.
The advantage of this approach is that you can almost copy and paste the redirection code block from this method to any other method that you want to modify in the same way.