Есть ли ярлык для вызова this.Invoke каждый раз, когда обратный вызов должен получить доступ к пользовательскому интерфейсу?Некоторое автоматическое делегирование в поток пользовательского интерфейса? - PullRequest
1 голос
/ 06 апреля 2011

Я разрабатываю графический интерфейс Windows Forms в шаблоне проектирования, который представляет собой комбинацию MVP и MVVM . *

Я связываю представление с моделью представления, используя код: представление подписывается на событие PropertyChanged виртуальной машины. Если докладчик устанавливает какое-либо свойство виртуальной машины, событие вызывается, и представление выполняет обратный вызов.

Таким образом, каждый обратный вызов в представлении должен быть заключен в this.Invoke( { ... } ).

Хотелось бы, чтобы был способ для определения свойства, установщик которого будет автоматически вызываться в потоке пользовательского интерфейса. Некоторый способ написать свойство или метод с автоматическим делегированием.

Я также отметил этот вопрос в WPF, потому что я использую C # 4.0, поэтому, если такой механизм существует в WPF, я буду рад использовать его для Windows Forms.

* Я использую MVVM, потому что приложение, вероятно, будет преобразовано в WPF на каком-то этапе.

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

Я вдруг понял, что используемая мной IoC Framework, Castle Windsor, может дать мне именно это. Я просто прикрепил перехватчик ко всем методам формы, и перехватчик делает это:

if (invocation.InvocationTarget.InvokeRequired)
{
     invocation.InvocationTarget.Invoke(invocation.Proceed);
}
else
{
     invocation.Proceed();
}

Позже я изменил приведенный выше код, поместив его в метод расширения со следующей подписью:

public void InvokeIfRequired(this Control uiObject, Action action)
1 голос
/ 06 апреля 2011

Чтобы определить установщик свойства, который всегда вызывается в потоке пользовательского интерфейса, вы можете сделать что-то вроде этого:

public int MyPropertyForTheUIThread
{
    get
    {
        return this.myRealValue;
    }

    set
    {
        if (this.myRealValue != value)
        {
            this.myRealValue = value;
            this.Invoke((Action)(()=>
                {
                    // The stuff I want to do on the UI thread when this property changes.
                });
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...