как использовать метод Invoke в файле расширений / методов? - PullRequest
7 голосов
/ 16 декабря 2011

Хорошо, я пишу файл расширений / метода, полезный для строк, меток, ссылок, классов и т. Д.

, но у меня есть проблема.У меня есть 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

как это исправить?

Заранее спасибо.

Ответы [ 5 ]

8 голосов
/ 16 декабря 2011

Почему бы просто не сделать это:

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

Нет необходимости создавать свой собственный делегат.Просто используйте встроенный Action делегат.Вам, вероятно, следует создать метод расширения для базового класса Control вместо класса Label.Это будет более многоразового использования.

3 голосов
/ 16 декабря 2011

Изменение

Invoke((UpdateState)delegate …

до

label.Invoke((UpdateState)delegate …
1 голос
/ 16 декабря 2011

Вам не нужно объявлять новый тип делегата или создавать новый лямбда или анонимный делегат.У вас уже есть метод, который действует в потоке пользовательского интерфейса - тот, который вы пишете.Просто сделайте так, чтобы он вызывал себя в потоке пользовательского интерфейса, если это необходимо, например:

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

Преимущество этого подхода состоит в том, что вы можете почти скопировать и вставить блок кода перенаправления из этого метода в любой другой метод, который выхочу изменить таким же образом.

1 голос
/ 16 декабря 2011

Invoke - это метод экземпляра из Control.
Вам нужно Control, чтобы вызвать его, например, label.

1 голос
/ 16 декабря 2011

Вы забыли указать метку в своем коде (при вызове метода 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 , чтобы не блокировать вызовнить (если применимо)

...