WPF -嵌套窗口

本文关键字:窗口 嵌套 WPF | 更新日期: 2023-09-27 18:05:03

我的应用程序由2主要组件组成。它们每个都有特定的功能。每个元素都是父元素的一半宽,并且始终可见。

我使用BackgroundWorker来处理数据,但问题是UI刷新有时也是很长的操作。而主要的问题是:一个组件冻结=应用程序冻结


所以我寻找解决方案如何在特定线程上运行每个组件。

我认为最好的是在特定的窗口运行每个组件(=每个窗口的UI线程)。如果一个组件冻结,其他组件可以运行。

我也读过关于VisualHost的文章,但是使用这个解决方案,您无法与控件进行交互。


但实际上我找不到解决方案,如何在主窗口内嵌套这个组件的Windows。请帮忙好吗?

WPF -嵌套窗口

在下面的文章MVVM: MVVM应用程序中的多线程和调度中,您将看到Microsoft . net框架如何处理线程以及当后台线程想要修改由主线程(也称为UI线程)创建的对象时需要采取哪些预防措施。您将看到这是如何导致崩溃的,为了避免崩溃,应该使用主线程的Dispatcher来正确处理该操作。希望这能帮到你。https://msdn.microsoft.com/en-us/magazine/dn630646.aspx

没有代码很难帮助。然而,主要思想是在-UI线程上执行长时间密集型操作,以避免冻结UI。

例如(不含MVVM模式):

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        Task.Run(() =>
        {
            Thread.Sleep(3000);
            txtBox.Dispatcher.Invoke(DispatcherPriority.Normal,
                  new Action(() => { txtBox.Text = "I am a TextBox"; }));
        });
    }

With MVVM pattern:

XAML:

<TextBlock Text="{Binding Number}" FontSize="188" Foreground="Red" />
ViewModel:

ViewModel:

public int Number { get; set; }
private void UpdateNumber()
{
        Task.Run(() => 
        {
            System.Timers.Timer timer = new System.Timers.Timer(250);
            timer.Elapsed += (sender, eventArgs) =>
            { 
                Number++;
                OnPropertyChanged("Number");//No exceptions, no errors
            };
            timer.Enabled = true;
        });
}