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

发布于 2024-12-21 17:32:59 字数 1175 浏览 1 评论 0原文

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

但是,我有一个问题。我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

痴意少年 2024-12-28 17:32:59

为什么不这样做:

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

不需要创建自己的委托。只需使用内置的 Action 委托即可。您可能应该为基 Control 类创建扩展方法,而不是标签类。它将更加可重复使用。

Why not just do this:

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

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.

于我来说 2024-12-28 17:32:59

更改

Invoke((UpdateState)delegate …

label.Invoke((UpdateState)delegate …

Change

Invoke((UpdateState)delegate …

to

label.Invoke((UpdateState)delegate …
一身骄傲 2024-12-28 17:32:59

您忘记在代码中指定标签(当您调用 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 代替,这样您就不会阻塞调用线程(如果适用)

You forgot to specify the label in your code (when you call the Invoke method):

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

also, consider using BeginInvoke instead so you won't block the calling thread (if applicable)

最单纯的乌龟 2024-12-28 17:32:59

InvokeControl实例方法
您需要一个 Control 来调用它,例如您的标签

Invoke is an instance method of Control.
You need a Control to call it on, such as your label.

半暖夏伤 2024-12-28 17:32:59

您不需要声明新的委托类型,或构造新的 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;
}

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

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.

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文