Как правильно передать UserControl, который содержит ресурсы между двумя потоками? - PullRequest
2 голосов
/ 02 февраля 2011

Я уже некоторое время пытаюсь разобраться в этой проблеме, и я просто в замешательстве.Я создал тип UserControl (отредактированный ниже), который пытаюсь сгенерировать и сериализовать из фонового потока.

Фоновый поток, генерирующий элемент управления, помечен как STA и использует поток памяти для передачи элемента управления.Однако элемент управления содержит шаблон данных в разделе 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

РЕДАКТИРОВАТЬ: элементы управления создаются и встроены в другойЭто связано с тем, что пользователь может загружать файл, содержащий много фрагментов данных (элементы управления находятся в шаблоне MVVM), каждый из которых представлен в виде представления на экране.Во время этого процесса я хотел бы, чтобы пользовательский интерфейс был отзывчивым и не блокировался.Я думаю, я мог бы пошатнуться, когда элементы управления отображаются на экране, а не все сразу, так как это будет основной горлышком бутылки с видами.

1 Ответ

0 голосов
/ 02 февраля 2011

EDIT: если вы действительно используете шаблон MVVM, вы должны создать свой элемент управления в главном потоке (UI), создать данные своего объекта в другом потоке и установить его как DataContext элемента управления, когда он будет доступен.Еще лучше, не создавайте элемент управления вообще, пока каждый 'DataContext' не станет доступным.Это распространенный способ обеспечить отзывчивость приложения, даже если вам, возможно, придется долго ждать получения данных, скажем, через Интернет.

СТАРЫЙ -> О первой части вашего вопроса: это не так.проблема с многопоточностью.Короче говоря, это не работает, потому что при попытке десериализации данных среда выполнения пытается снова добавить шаблон во внутреннее представление XAMLType вашего объекта.Этот эффект не ограничивается шаблонами, однако любой указанный вами ресурс вызовет проблему при попытке загрузить его таким способом.Даже присвоение имен и т. Д. Элементам XAML в вашем элементе управления вызовет проблемы.

РЕДАКТИРОВАТЬ: подход сериализатора XAML, который вы пытаетесь использовать, не является тем, для чего он предназначен.Кроме того, вы не хотите создавать элементы управления в другом потоке по причине, указанной в комментарии.

...