【发布时间】: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