Создание элемента WPF в другом потоке - PullRequest
2 голосов
/ 13 сентября 2010

Я могу запустить 2 или более окон WPF в другом потоке.Проблема в том, что теперь мое приложение разбито на множество окон.

Мне действительно нужно главное окно, связанное с сеткой, в которой каждая ячейка содержит элемент, управляемый другим потоком.

Можно ли создать UIElement / Component, управляемый потоком, который не является тем, который управляет родительским / содержащим окном?

или

Можно ли инкапсулировать окно, которое выполняется надругой поток в каком-то кадре / UIElement?

Спасибо


Можно ли использовать MediaElement для проецирования окна на панель?

Ответы [ 2 ]

1 голос
/ 13 сентября 2010

"Что мне действительно нужно, так это иметь главное окно, связанное с сеткой, в которой каждая ячейка содержит элемент, управляемый другим потоком."

Один из способов сделать это - создать элементы в ячейке. Создайте обычный класс ViewModel, который не касается пользовательского интерфейса, а работает в своем собственном потоке. Этот класс - это мозг, который стоит за тем, что вы на самом деле пытаетесь делать в своих клетках, а не то, что вы пытаетесь ПОКАЗАТЬ в своих клетках. Этот класс ViewModel должен реализовывать INotifyPropertyChanged, когда его данные были обновлены. В вашем файле MainWindow.cs вы можете установить DataContext элементов вашей ячейки для этих ViewModels. Наконец, в вашем XAML вы можете связать вещи, которые вы пытаетесь показать, с помощью свойств в вашей ViewModel.

Я знаю, что у меня много подробностей, но это отправная точка. Здесь вам помогут, если понадобится.

1 голос
/ 13 сентября 2010

Это невозможно в WPF, и даже если бы это было так, это было бы плохой идеей:

  1. Это невозможно в WPF, поскольку элемент WPF может использоваться только созданным потоком.их, если вы добавите дочерний элемент из другого потока, они не смогут общаться.

  2. В чистом Win32 это возможно - но он объединяет две очереди сообщений потоков, так что потокибольше не являются независимыми (поэтому, даже если вы найдете хак, который заставляет его работать с WPF, он все равно вам не поможет)

  3. Любой поток, имеющий пользовательский интерфейс и выполняющий долгосрочную задачу, можетповесил всю систему - поэтому бессильно никогда не выполнять ни одной длительной задачи в потоке пользовательского интерфейса - вместо этого запустите длинную задачу в фоновом потоке

  4. , потому что вы должны поддерживать поток пользовательского интерфейса отзывчивым-> он никогда не должен быть занят в течение заметного промежутка времени -> он может обрабатывать все ваши окна, потому что он не слишком занят.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...