Итак, скажем, у меня есть поток STA, работающий на фоне, и я создаю пользовательский элемент управления там.Каковы последствия создания элементов управления WPF в фоновом потоке?
Насколько функционально это будет? Каковы ограничения?
_workingThread = new Thread(() =>
{
//so far so good
var myControl = new MyCustomControl();
//what happens if i set DataContext? Will databinding work?
//It looks like it does, but I am not entirely sure.
myControl.DataContext = new MyViewModel();
//if databinding works, can I assume that at this point
//myControl's properties are already updated?
//what happens exactly if I invoke a delgate using Dispatcher property?
myControl.Dispatcher.Invoke(SomeMethod);
//or current dispatcher?
Dispatcher.CurrentDispatcher.BeginInvoke(SomeOtherMethod);
});
_workingThread.SetApartmentState(ApartmentState.STA);
_workingThread.Start();
Чтобы ответить на вопрос, почему: есть компонент в .NET называется XpsDocument
, который позволяет писать визуальными в xps
файл. Я не вижу причины, почему я должен это делать в потоке пользовательского интерфейса.
Почему, а почему вы, возможно, захотите это сделать? Кажется, что это самая большая вещь, которую нужно сделать ... –
Почему вы хотите это сделать? Я считаю, что проблема возникнет, когда вы попытаетесь передать ее с помощью элементов управления для других потоков. Кроме того, он не получит обычные сообщения от насоса сообщений (например, обновление) – slawekwin
Будет привязана привязка данных. Это может продолжаться до тех пор, пока на вашем контроле фактически не будет установлено все его свойства с помощью привязок, потому что шаблоны могут применяться и т. Д. Если вы вызываете делегата через диспетчер элемента управления, вызов будет выполняться в вашем потоке. Dispatcher.CurrentDispatcher должен возвращать тот же экземпляр, что и myControl.Dispatcher, потому что CurrentDispatcher вызывается в том же потоке, где был создан myControl. – Clemens