Xaml парсинг и многопоточность - PullRequest
1 голос
/ 07 апреля 2011

Я хотел бы загрузить Xaml из кода, запущенного в фоновом потоке.Я понимаю, что мне придется синхронизироваться с диспетчером.Однако, это терпит неудачу (бросает исключение).Почему?

Вот код

public MainWindow()
{
    InitializeComponent();
    Thread thread = new Thread(new ThreadStart(delegate
                    {
                        Dispatcher.Invoke(new Action(delegate
                        {
                            Content = XamlReader.Parse(
                                      "<Button xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
                                               Content='Hello World'/>");
                        }));
                    }));
    thread.Start();
}

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Как Павел упомянул , вам также нужно установить свой контент в Диспетчере.

Впрочем, скажу - это довольно бесполезно.

Помните, что когда вы вызываете Dispatcher.Invoke или BeginInvoke, вы явно говорите, чтобы запустить этот код в потоке пользовательского интерфейса. Запуская фоновый поток, который ничего не делает, только вызывает обратно в поток пользовательского интерфейса, вы фактически выполняете ту же самую работу в потоке пользовательского интерфейса, с недостатком добавления дополнительных издержек в систему, а также более сложной отладки. В этом случае вам просто нужно загрузить файл напрямую.

0 голосов
/ 08 апреля 2011

Это кажется плохой идеей по нескольким причинам.Ожидаете ли вы получить фрагменты XAML из базы данных или другого хранилища, и вы не можете создать экземпляры этих элементов управления в C #?Вы можете просто создать Button напрямую.

Можете ли вы позволить данным управлять вашей визуализацией?Хорошим примером этого является наличие коллекции объектов ICommand (CommandViewModel, RelayCommand и т. Д.) И CommandView, которые вы хотите использовать для представления вашей команды?В этом случае это может быть <Button> с привязкой к свойству CommandViewModel Title или Content.

Ваш фоновый поток может затем использоваться для управления заполнением данных (коллекций, свойств), и выпользовательский интерфейс будет разработан для гибкого размещения ожидаемых шаблонов данных.

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