WPF从同一线程中的另一个窗口更新一个窗口的UI控件

时间:2018-10-17 10:29:41

标签: wpf multithreading

假设我定义了两个WindowWindowA的{​​{1}}。

WindowB有一个名为WindowA的{​​{1}}。

Button有一个名为btn的{​​{1}}。

当用户单击WindowB中的按钮时,将显示Label并执行一些逻辑。

processLbl

结果是显示WindowA,但其标签的内容未更新。

我想这是可以预期的,因为WindowBWindowB windowB; private void btn_Click(object sender, RoutedEventArgs e) { windowB = new WindowB(); windowB.Owner = Application.Current.MainWindow; windowB.Show(); for (int i = 0; i < 100; i++) { // do something Thread.Sleep(100); updateLabel(i); } windowB.Close(); } private void updateLabel(int value) { windowB.processLbl.Content = value; } 都在同一线程上。

因此,使用windowB是没有用的。

但是有没有办法做到这一点,或者我必须在另一个线程上显示windowA

如果这样做,如何从运行windowB的线程访问Dispatcher.Invoke的标签?

1 个答案:

答案 0 :(得分:1)

尝试使用如下所示的Dispatcher Timer,

    WindowB window;
    DispatcherTimer timer = new DispatcherTimer();
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        window = new WindowB
        {
            Owner = Application.Current.MainWindow
        };
        window.Show();  
        timer.Tick -= Timer_Tick;          
        timer.Tick += Timer_Tick;
        timer.Interval = new TimeSpan(0, 0, 1);
        timer.Start();

    }
    int tickCount = 1;
    private void Timer_Tick(object sender, EventArgs e)
    {
        if (tickCount == 100)
        {
            window.Close();
            timer.Stop();
        }
        updateLabel(tickCount);
        tickCount++;

    }

    private void updateLabel(int value)
    {
        window.lbl.Content = value;
    }

正如评论中提到的克莱门斯,Thread.Sleep blocks the UI thread