【问题标题】:How to open and update WPF window by threading如何通过线程打开和更新 WPF 窗口
【发布时间】:2010-06-22 10:59:00
【问题描述】:

我有两个 WPF 窗口 Window1.xaml 和 window2.xaml。 在 window2.xaml.cs 中,我有一个函数可以进行一些复杂的计算并在 TextBlock 上显示中间结果。

现在我想要什么。 通过单击 Window1.xaml 的按钮,我想将 Window2.xaml 作为对话框打开,并希望执行 windows2.xaml 的复杂功能。

如果我在 Window2.xaml 的加载事件上调用复杂按钮,则在执行复杂函数后会出现对话框。

如何通过线程来做到这一点。

【问题讨论】:

    标签: wpf multithreading window


    【解决方案1】:

    您无需在线程中打开窗口。打开 Window2 后,为 Window2.Loaded 事件处理程序中的复杂函数启动一个线程。这将使您的 UI 不受干扰。

    【讨论】:

    • private void Window_Loaded(object sender, RoutedEventArgs e) { Thread t = new Thread(ComplexFunction); t.Start(); } and in ComplexFunction() { // 做一些事 UpdateStatus("adasd"); // 做某事 UpdateStatus("dsad");它给出了运行时错误。调用线程无法访问此对象,因为另一个线程拥有它 UpdateStatus(string status) { StatusText.AppendText(status + "\r"); }
    • @Jeevan Bhatt:如果您正在访问在 UIThread 中创建的任何元素,那么您可能需要请求调度程序为您提供帮助。 myDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => { // Code that accessess UIElement })); 其中 myDispatcher 是对 Dispatcher.CurrentDispatcher 的引用 在调用线程之前设置它。
    【解决方案2】:

    完全不建议在非 UI 线程的线程中打开窗口。您可以使用Show()(无模式)方法或ShowDialog()(模式)方法打开一个弹出窗口。在Window2的load方法中,你可以启动一个新的线程来做一个复杂的操作,一旦操作完成,它就会显示一个对话框。

    现在,在与 UI 线程不同的线程中时,如果您想显示任何 UI(对话框、窗口)或更改现有 UI(文本块等),您必须使用 Dispatcher.Invoke 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      相关资源
      最近更新 更多