关于c#:Application.Current和App.Current为null

Application.Current and App.Current is null

我正在创建一个应用程序(Outlook的Office加载项)

我遇到的问题是更新屏幕。 我知道我需要使用调用Dispatcher,但是在我的ViewModel中它始终为null

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种方法,但是Current始终为null。

奇怪的是,如果我在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?