【问题标题】:How do I correctly pass a UserControl that contains resources between two threads?如何在两个线程之间正确传递包含资源的 UserControl?
【发布时间】:2011-06-20 00:58:43
【问题描述】:

我一直在尝试解决这个问题一段时间,但我很困惑。我创建了一个 UserControl 类型(在下面编辑),我试图从后台线程生成和序列化。

生成控件的后台线程被标记为STA,并使用内存流传递控件。但是,该控件在 UserControl.Resources 部分中包含一个数据模板,该模板在反序列化期间会导致错误。

如果不在外部合并资源字典中定义资源,是否无法在线程之间传递包含资源的用户控件?

代码: 用户控制:

<UserControl x:Class="WPF_Base.Example">
 <UserControl.Resources>
   <DataTemplate DataType={x:Type Example2}>
     <Example2View />
   </DataTemplate>
 </UserControl.Resources>
 <Grid>
  <StackPanel>
   <ItemsControl ItemSource="{Binding GetExamples}" />
  </StackPanel>
 </Grid>
</UserControl>

ThreadCode(呈现为单线程):

            System.IO.MemoryStream streamer = new System.IO.MemoryStream();

            var testExample = new WPF_Base.Example();
            var test = System.Windows.Markup.XamlWriter.Save(testExample);

            var test2 = new System.IO.StringReader(test);
            var test3 = System.Xml.XmlReader.Create(test2);
            var test4 = (WPF_Base.TestExample)System.Windows.Markup.XamlReader.Load(test3); //Exception thrown here about key already existing in the dictionary

编辑: 控件正在另一个线程中生成和构建,因为用户可能正在加载包含许多数据的文件(控件采用 MVVM 模式),每个数据都表示为屏幕上的视图。在此过程中,我仍然希望 UI 能够响应并且不会出现“锁定”。我想我可能会在控件呈现到屏幕时错开而不是一次全部呈现,因为这将是视图的主要瓶颈。

【问题讨论】:

  • 在 MVVM 中,将控件与其数据分开。请参阅我编辑的答案。
  • 数据和控件是分开的。问题似乎是一次渲染所有控件。我现在意识到在后台线程上创建它们不会修复,因为它们在显示之前不会被渲染。

标签: c# wpf xaml serialization user-controls


【解决方案1】:

编辑: 如果您确实在使用 MVVM 模式,则应在主 (UI) 线程上创建控件,在另一个线程上创建对象数据,并在可用时将其设置为控件的 DataContext。更好的是,在每个“DataContext”可用之前,根本不要创建控件。这是一种让您的应用程序保持响应的常用方法,即使您可能需要等待很长时间才能获得数据,例如通过 Internet。

OLD --> 关于你问题的第一部分: 这不是线程问题。简而言之,这是行不通的,因为当您尝试反序列化数据时,运行时会再次尝试将模板添加到对象的内部“XAMLType”表示中。但是,此效果不仅限于模板,当您尝试以这种方式加载时,您定义的任何资源都会导致问题。即使给控件中的 XAML 元素命名等也会导致问题。

编辑: 您尝试使用的 XAML 序列化程序方法不是它的用途。此外,由于您在评论中提到的原因,您不想在另一个线程上创建控件。

【讨论】:

  • 传递对象引用的问题是当主线程去使用生成的控件时会抛出异常。例外是只有创建控件的线程才能使用它。
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多