从MainWindow更新第二个窗口UI

时间:2018-09-29 16:51:07

标签: c# wpf

我在MainWindow类上声明了一个私有变量,以便以后可以使用它:

private GraphicPresenterWindow _GraphicPresenterWindow;

MainWindow构造函数上,以下行打开一个新窗口:

_GraphicPresenterWindow = new GraphicPresenterWindow();
_GraphicPresenterWindow.Show();

两个窗口同时保持打开状态。

我的问题是,当我尝试从主窗口中为某些Visibility更新StackPanels并为Text更新TextBlocks时。

这里是代码(为简洁起见,我没有发布整个方法):

private void MainWindow_ShowFirstGraphBtn_Click(object sender, RoutedEventArgs e)
{
    // previous code omitted

    var CanShow = PresenterAPI.CanShowFirstGraph();
    if (CanShow)
    {
        _GraphicPresenterWindow.InitialGraphStack.Visibility = Visibility.Collapsed;
        _GraphicPresenterWindow.FirstGraphStack.Visibility = Visibility.Visible;
        _GraphicPresenterWindow.FirstGraphTxtBlock.Text = string.Format("{0} retrospective", _YearNo);
    }

    // following code omitted
}

第二个窗口更新,但仅在执行整个MainWindow_ShowFirstGraphBtn_Click方法时更新。

在执行此方法的调用时,如何强制第二个窗口更新值?

我也尝试使用Dispatcher,但没有结果。

1 个答案:

答案 0 :(得分:0)

即使按照问题注释中的建议使用数据绑定和视图模型,您也会通过单线程方法观察到相同的问题。

其原因是您要在主线程上执行“艰苦的工作”(您的MainWindow_ShowFirstGraphBtn_Click方法)。当您的方法正在执行时,WPF Dispatcher无法完成其工作,只是等待您的方法完成。 Dispatcher负责排队所谓的调度程序操作,包括数据绑定,渲染或输入处理。

在您的方法中执行以下代码时:

InitialGraphStack.Visibility = Visibility.Collapsed;

您实际上只是声明一个意图即可更改元素的可见性。为了使这种情况真正发生,WPF Dispatcher需要将排队并执行几个操作:依赖项属性更新和渲染。但这在您的方法继续进行时是不可能的。这就是为什么只在方法返回时或在多线程解决方案中看到更改的原因(Dispatcher可以使操作独立于在工作线程上运行的方法而排队)。

您现在有两个选择:

  • 多线程解决方案(在辅助线程上运行“努力工作”方法)。
  • 将您的方法分解为多个部分,并在长时间运行的处理执行期间让Dispatcher插入几次。有an example in the WPF Threading Model个文档说明了如何做到这一点。