7

好吧,我正在编写一个对字符串、标签、链接标签、类等有用的扩展/方法文件。

但是,我有一个问题。我有一种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

我该如何解决这个问题?

提前致谢。

4

5 回答 5

8

为什么不这样做:

label.BeginInvoke( (Action) (() => label.Text = text));

无需创建自己的委托。只需使用内置的Action委托。您可能应该为基本Control类而不是 Label 类创建扩展方法。它会更加可重复使用。

于 2011-12-16T16:46:14.677 回答
3

改变

Invoke((UpdateState)delegate …

label.Invoke((UpdateState)delegate …
于 2011-12-16T16:42:42.400 回答
1

您无需声明新的委托类型,或构造新的 lambda 或匿名委托。您已经有了一种作用于 UI 线程的方法——您正在编写的方法。如果需要,只需让它在 UI 线程上调用自己,就像这样。

public static void ShowMessage(this Label label, string text) {

    if(label.InvokeRequired) {
        label.Invoke(new Action<Label, string>(ShowMessage), label, text);
        return;
    }

    label.Text = text;
}

这种方法的优点是您几乎可以将重定向代码块从该方法复制并粘贴到您要以相同方式修改的任何其他方法。

于 2011-12-16T16:58:28.310 回答
1

您忘记在代码中指定标签(当您调用 Invoke 方法时):

public static void ShowMessage(this Label label, string text)
        {
            if (label.InvokeRequired)
            {
                lablel.Invoke((UpdateState)delegate
                {
                    label.Text = text;
                });
            }
            else
            {
                  label.Text = text;
            }
        }

另外,请考虑改用BeginInvoke,这样您就不会阻塞调用线程(如果适用)

于 2011-12-16T16:42:16.180 回答
1

Invoke是 的实例方法。 您需要调用它,例如您的.Control
Controllabel

于 2011-12-16T16:43:24.833 回答