【发布时间】:2017-01-31 08:08:33
【问题描述】:
我正在创建一个应用程序(Outlook 的 Office 插件)
我遇到的问题是更新我的屏幕。我知道我需要调用 Dispatcher,但是在我的 ViewModel 中它始终为空
private ObservableCollection<string> _updates;
public ObservableCollection<string> Updates
{
get { return this._updates; }
set
{
this._updates = value;
OnPropertyChanged("Updates");
}
}
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += ((s, e) =>
{
//logic
UpdateProgress("Finished");
});
bw.RunWorkerAsync();
private void UpdateProgress(string s)
{
//Application.Current.Dispatcher.Invoke(() =>
// {
App.Current.Dispatcher.Invoke(() =>
{
this.Updates.Add(s);
//});
});
}
如您所见,我尝试了 2 种方法,但 Current 始终为空。
奇怪的是,如果我在 MainWindow 后面的代码中使用相同的代码,那么以下代码可以正常工作
private void UpdateProgress(string s)
{
Dispatcher.Invoke(() =>
{
this.Update = s;
});
}
我看过了,原因是因为MainWindow后面的代码继承自Window。
我的问题是,我是否必须创建一个新的 Dispatcher 对象,或者我是否缺少某些东西。我要做的就是在线程运行时更新我的 GUI。
【问题讨论】:
-
Application.Current 如果您尝试在非 UI 线程中访问它,则应为 null。您可以将构造函数中对调度程序的引用保存为字段成员,然后在非 UI 线程中使用它。
-
WPF 的正常入口点是 Main()。这是自动生成的以创建您的 App.xaml 类实例,很难看到。入口点不再是加载项中的 Main(),而是您的 Startup 事件处理程序。所以你必须自己创建你的应用程序实例。样板代码is here.
-
@HansPassant,有什么办法可以将此评论移至答案?
-
只需在您自己的帖子中输入答案,显示您的 Startup 事件处理程序的外观,并将其标记为答案。