WPF - 嵌套窗口

时间:2016-08-31 15:03:50

标签: c# wpf multithreading

我的应用程序包含 2 主要组件。他们每个人都有特定的功能。它们中的每一个都是父母的半宽,并且始终可见。

我使用BackgroundWorker处理数据,但问题是UI刷新有时也会长时间运行。主要问题是:一个组件冻结=应用程序冻结

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

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

我还阅读了有关VisualHost的文章,但是使用此解决方案,您无法与控件进行交互。

但实际上我找不到解决方案,如何在主窗口中嵌套这个组件的Windows。有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

例如(没有MVVM模式):

class Home extends React.Component { 

  render() {
    return (
      <View style={{flex: 1, backgroundColor: '#fff'}}>
        <Text style={{margin: 10, fontSize: 15, textAlign: 'left'}}>I'm in the Drawer!</Text>
        <Text>Auth key : {this.props.profile ? this.props.profile.authentication_token : 'authentication_token'}</Text>
      </View>
    );
  }
}

//module.exports = Home;

import { connect } from 'react-redux';

module.exports = connect(
  (state) => {
    return {
      profile: state.profile
    }
  },
  null
)(Home)

使用MVVM模式:

XAML:

 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"; }));
        });
    }

视图模型:

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