#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, большой кусок кода для каждого свойства. Я думал, что есть что-то, что избавит меня от лишнего кода.