Есть ли какой-нибудь ярлык для вызова этого.Вызывать каждый раз, когда обратному вызову требуется доступ к пользовательскому интерфейсу? Какое-нибудь автоматическое делегирование потоку пользовательского интерфейса?

#wpf #winforms #user-interface #c#-4.0 #invoke

#wpf #winforms #пользовательский интерфейс #c #-4.0 #вызвать

Вопрос:

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

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

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

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

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

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

Комментарии:

1. Можете ли вы предоставить какой-нибудь псевдокод того, чего вы хотите достичь?

2. Привет @Jeff, спасибо за попытку помочь, в любом случае смотрите мой ответ ниже. Но если у вас есть какие-либо идеи, я буду рад услышать.

Ответ №1:

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

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

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

 public void InvokeIfRequired(this Control uiObject, Action action)
  

Ответ №2:

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

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

Комментарии:

1. Это все еще заставляет меня вставлять в свой код множество вызовов InvokeRequested и Invoke, большой кусок кода для каждого свойства. Я думал, что есть что-то, что избавит меня от лишнего кода.