Application.Current and App.Current is null
我正在创建一个应用程序(Outlook的Office加载项)
我遇到的问题是更新屏幕。 我知道我需要使用调用Dispatcher,但是在我的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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种方法,但是
奇怪的是,如果我在MainWindow后面的代码中使用相同的代码,则以下代码可以正常工作
1 2 3 4 5 6 7 | private void UpdateProgress(string s) { Dispatcher.Invoke(() => { this.Update = s; }); } |
我已经阅读了,原因是因为后面的MainWindow代码是从Window继承的。
我的问题是,我必须创建一个新的Dispatcher对象还是缺少某些内容。 我要做的就是在线程运行时更新我的GUI。
在评论中回答了汉斯·帕桑特
The normal entrypoint for a WPF is Main(). Which is auto-generated to create your App.xaml class instance, hard to see. The entrypoint is no longer Main() in an add-in, it is now you Startup event handler. So you have to create your app instance yourself. Boilerplate code is http://stackoverflow.com/a/2694710/17034
Application.Current和App.Current为空
作为解决方法,您可以执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 | public MainWindow() { InitializeComponent(); AppWindow = this; // Here you set the static member to reference this MainWindow. } public static MainWindow AppWindow { get; private set; } |
然后在您的视图模型中:
1 2 3 4 5 6 7 8 | private void UpdateProgress(string s) { MainWindow.AppWindow.Dispatcher.Invoke(() => { this.Updates.Add(s); //}); }); } |
如果试图从Winforms应用程序打开WPF应用程序,则Application.Current为null。 Application.Current仅是WPF应用程序的功能,而不是Winforms的功能。 您可以尝试以下链接:
为什么在WinForms应用程序中Application.Current == null?