나는이 문제를 잠시 동안 알아 내려고 노력해 왔으며 지금 당황 스럽다. 백그라운드 스레드에서 생성 및 직렬화하려고하는 UserControl 유형 (아래 편집)을 작성했습니다.두 스레드간에 리소스가 포함 된 UserControl을 올바르게 전달하는 방법은 무엇입니까?
컨트롤을 생성하는 백그라운드 스레드는 STA로 표시되고 메모리 스트림을 사용하여 컨트롤을 전달합니다. 그러나 컨트롤에는 deserialization 중에 오류를 일으키는 UserControl.Resources 섹션의 데이터 템플릿이 포함되어 있습니다.
외부 병합 된 리소스 사전의 리소스를 정의하지 않고 스레드간에 리소스를 포함하는 사용자 정의 컨트롤을 전달할 수 있습니까?
번호 : UserControl을 (단일 스레드로 표시)
<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
EDIT : 컨트롤이 생성되고 인해위한 다른 스레드에 내장되고 해당 사용자가 각각 화면의 뷰로 표시되는 많은 데이터 조각 (컨트롤이 MVVM 패턴으로 있음)을 포함하는 파일을로드하고있는 것일 수 있습니다. 이 과정에서 나는 여전히 UI가 응답 성이 좋고 "잠그는"것처럼 보이기를 원할 것입니다. 컨트롤이 스크린 대신에 렌더링 될 때마다 비틀 거리는 것 같아요. 뷰가있는 주요 병목 일 것이기 때문입니다.
MVVM에서 컨트롤에서 데이터를 분리합니다. 내 편집 된 답변보기 –
데이터와 컨트롤이 분리됩니다. 문제는 모든 컨트롤을 한 번에 렌더링하는 것 같습니다. 배경 스레드에서 생성 할 때까지 표시되지 않기 때문에 수정되지 않는다는 것을 알았습니다. – JMcCarty