我有一个名为MainWindow的主窗口类的WPF应用程序。 由于我有其他类需要访问UI线程的Dispatcher来更新有界列表,我找到了这个解决方案:
我做了一个静态课程:
static class UI
{
static public MainWindow window;
}
并在app构造函数中添加以下行:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
UI.window = this;
...
现在,我可以使用UI.window.Dispatcher.Invoke().
问题是 - 这是一个很好的编程习惯吗? 有没有更好的方法呢?
谢谢
更新
我似乎只有在更新绑定到第三方控件的ObservableCollection时才会抛出异常。我有一个绑定到列表框的另一个静态OC(显示更新的消息),我可以在不使用调度程序的情况下从其他线程更新该消息。 怎么会? 是因为它是静态OC还是与控件有关?
答案 0 :(得分:4)
因为我有其他类需要访问UI线程的Dispatcher来更新有界列表
就个人而言,如果你需要这个,我只会保存对Dispatcher的引用,而不是整个UI。
提供对Window本身的引用可能会引起混淆。这里的意图并不明确。
答案 1 :(得分:4)
在一般的情况下,它并不理想 - 如果您希望线程独立,或者您希望垃圾收集来收集窗口,static
有一些陷阱 - 但可以说是你可以为你主窗口侥幸逃脱,因为那可能基本上是单身,并且持续了应用程序的生命周期。
我个人可能不会 - 我会通过属性或构造函数参数传递它 - 但我有点挑剔。
答案 2 :(得分:2)
如果仅关于调度员,你可以这样做
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate()
{
});