WPF -嵌套窗口
本文关键字:窗口 嵌套 WPF | 更新日期: 2023-09-27 18:05:03
我的应用程序由2主要组件组成。它们每个都有特定的功能。每个元素都是父元素的一半宽,并且始终可见。
我使用BackgroundWorker来处理数据,但问题是UI刷新有时也是很长的操作。而主要的问题是:一个组件冻结=应用程序冻结。
所以我寻找解决方案如何在特定线程上运行每个组件。
我认为最好的是在特定的窗口运行每个组件(=每个窗口的UI线程)。如果一个组件冻结,其他组件可以运行。
我也读过关于VisualHost的文章,但是使用这个解决方案,您无法与控件进行交互。
但实际上我找不到解决方案,如何在主窗口内嵌套这个组件的Windows。请帮忙好吗?
在下面的文章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;
});
}