我创建了一个输出窗口,使用Prism的EventAggregator
订阅了多个事件。到目前为止,构造函数正在处理两个不同的事件:
public OutputWindowView(IEventAggregator eventAggregator)
{
eventAggregator.GetEvent<LoginStatusEvent>().Subscribe(trackLogin, true);
eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, true);
this.InitializeComponent();
}
两个事件都通过SetText
方法定位相同的UI组件:
private void trackLogin(LoginStatus s)
{
SetText("Connected: " + s.IsConnected.ToString());
}
private void trackMessage(string s)
{
SetText(s);
}
我正在尝试创建委托以避免线程错误。
private delegate void SetOutputText(string content);
private void SetText(string content)
{
Trace.WriteLine("===== SetText =====");
var text = content + Environment.NewLine;
if (this.txtOutput.Dispatcher.CheckAccess() == false)
{
Trace.WriteLine("->CheckAccess > false");
SetOutputText _output = new SetOutputText(SetText);
this.Dispatcher.Invoke(_output, text);
}
else
{
Trace.WriteLine("->CheckAccess > true");
this.txtOutput.Text += text;
}
}
输出悬停为:
===== SetText =====
->CheckAccess > false
===== SetText =====
->CheckAccess > true
我希望输出为:
===== SetText =====
->CheckAccess > false
OR
===== SetText =====
->CheckAccess > true
但似乎被叫了两次。
答案 0 :(得分:1)
您可以通过ThreadOption.UIThread
这样传递
eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, ThreadOption.UIThread, true);
甚至更简单,绑定到您的viewmodel上的属性并且您已完成,因为INotifyPropertyChanged
事件会自动编组到UI线程。