Как обработать исключение system.InvalidOperationException при преобразовании из System. windows .FormsMessageBox в Xceed.Wpf.Toolkit.MessageBox - PullRequest
0 голосов
/ 24 февраля 2020

У меня очень мягкий ящик сообщений, задающий пользователям простой вопрос (не да или нет). Для быстрой разработки я использовал простую System. Windows .Forms.MessageBox и сформулировал вопрос («Если вы хотите выбрать« A », нажмите« Да », если вы хотите выбрать« B », нажмите« Нет »»). Теперь я возвращаюсь и улучшаю внешний вид моего wpf-приложения, и я застрял, пытаясь преобразовать этот MessageBox во что-то, что выглядит хорошо.

Мой предварительный поиск сказал мне использовать Xceed.Wpf.Toolkit.MessageBox, чтобы быть Я могу создать собственное окно сообщения, но я получаю исключение, когда пытаюсь его использовать.

Старый код

DialogResult dialogResultForDataDisplay = System.Windows.Forms.MessageBox.Show("Yes: Display by properties \n \t Each row will contain data for a specific asset class in a specific submarket during a specific quarter. \n \n No: Display by quarters \n \t Each row will will show the change over time for a specific property of an asset class in a specific submarket.", "Data Grouping Format", MessageBoxButtons.YesNo);

Новый код

Style style = new Style();
style.Setters.Add(new Setter(Xceed.Wpf.Toolkit.MessageBox.YesButtonContentProperty, "By Property"));
style.Setters.Add(new Setter(Xceed.Wpf.Toolkit.MessageBox.NoButtonContentProperty, "By Quarter"));
MessageBoxResult result = Xceed.Wpf.Toolkit.MessageBox.Show("How do you want your information displayed?", "My caption", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.Yes, style);
        Console.WriteLine(result);

Новый код генерирует это исключение: System.InvalidOperationException: 'The calling thread must be STA, because many UI components require this.'

Как бы вы go Об обработке этого исключения?

1 Ответ

0 голосов
/ 24 февраля 2020

Одно из решений, которое я нашел сейчас, - это добавление его в метод invoke. Если у кого-то есть лучшее решение, пожалуйста, напишите.

MessageBoxResult result = MessageBoxResult.None;
System.Windows.Application.Current.Dispatcher.Invoke((Action)delegate
{
    Style style = new Style();
    style.Setters.Add(new Setter(Xceed.Wpf.Toolkit.MessageBox.YesButtonContentProperty, "Yes, FTW!"));
    style.Setters.Add(new Setter(Xceed.Wpf.Toolkit.MessageBox.NoButtonContentProperty, "Omg, no"));
    result = Xceed.Wpf.Toolkit.MessageBox.Show("How do you want your information displayed?", "My caption", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.Yes, style);
}
Console.WriteLine(result);
...