如何在扩展/方法文件中使用Invoke方法?

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

如何解决这个问题?
提前致谢。

你可以使用现有的Action委托;不需要自己创建。 - SLaks
可能是 (label.TopLevelControl as Form).Invoke - Joe
5个回答

8
为什么不直接这样做:
label.BeginInvoke( (Action) (() => label.Text = text));

不需要创建自己的委托。只需使用内置的Action委托。您应该为基本Control类创建扩展方法,而不是Label类。这样更具可重用性。


3

修改

Invoke((UpdateState)delegate …

为了

label.Invoke((UpdateState)delegate …

没错。你需要的“Invoke”方法是System.Windows.Forms.Control类的成员,而Label是从该类派生的。你的静态LabelExtensions类没有“Invoke”方法。 - KeithS

1

InvokeControl 的一个实例方法。
您需要一个 Control 对象才能调用它,比如您的 label


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,这样就不会阻塞调用线程(如果适用的话)。

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;
}

这种方法的优点是,你几乎可以将重定向代码块从这个方法复制并粘贴到任何其他想以同样方式修改的方法中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接