Как сохранить WPF MessageBox на вершине, если создается в отдельном потоке - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь показать окно сообщения поверх других окон, а также других приложений, которые работают.Поскольку я должен убедиться, что этот вызов не блокирует никакие операции в моем приложении, я использую отдельный поток, чтобы показать окно сообщения.Моя проблема со следующей реализацией заключается в том, что окно сообщения находится не над основным приложением, оно всегда скрыто / за моим главным окном.

 Task.Run(() =>
              {
                  var dialogResult = MessageBox.Show(Application.Current.MainWindow, e.Message, "Message", MessageBoxButton.OK, MessageBoxImage.Information);
                  OnMessageConfiration(dialogResult);
              });

Application.Current.MainWindow как параметр для WindowOwner не работает для этой реализации, так как он генерирует исключение, потому что он не работает в потоке пользовательского интерфейса, я думаю.

Есть ли другое решение для достижения моей цели?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Для тех, кто сталкивается с той же проблемой и не хочет работать с фрагментами ответа, приведенными в комментариях:

    try
    {
        MessageBoxResult result = await ShowMessageBoxAsync(e.Message);
        if (result == MessageBoxResult.OK)
            _log.InfoFormat("acknowledged");
        else
            _log.InfoFormat("no acknowledge");
    }


    public async Task<MessageBoxResult> ShowMessageBoxAsync(string message)
    {
        await Task.Run(() =>
        {
          return Application.Current.Dispatcher.Invoke(() => MessageBox.Show(Application.Current.MainWindow, message, "Message", MessageBoxButton.OK, MessageBoxImage.Information));
        });
    }

Это способ не блокировать вызывающий поток идержать окно сообщения в верхней части главного окна приложения.

Спасибо vasily.sib за подсказки.

0 голосов
/ 03 октября 2018

Используйте Dispatcher для отображения окна сообщения.

        Task.Run(() =>
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                MessageBox.Show(Application.Current.MainWindow, "T", "Message", MessageBoxButton.OK, MessageBoxImage.Information);
            }), null);
        });
...