Я создал оболочку для вызова диалогового окна сообщений MahApps.Metro, потому что у меня была такая же проблема с моим проектом MVVM. Мне пришлось создать список открытых окон, первое окно которого всегда будет моим MainWindow.
Вот мой DialogService
код:
public async Task<MessageDialogResult> ShowMessage(string message, MessageDialogStyle dialogStyle)
{
var metroWindow = (_openedViews.First() as MetroWindow);
metroWindow.MetroDialogOptions.ColorScheme = MetroDialogColorScheme.Accented;
return await metroWindow.ShowMessageAsync("MY TITLE", message, dialogStyle, metroWindow.MetroDialogOptions);
}
Этот код можно использовать для отображения диалогов с результатом или без него. Вы можете заметить, что его возвращаемым значением является Task<MessageDialogResult>
, поэтому, если вы хотите получить результат, вы можете сделать то же самое на своей ViewModel:
MessageDialogResult result = await _dialog.ShowMessage("SOME MESSAGE HERE", MessageDialogStyle.AffirmativeAndNegative).ConfigureAwait(false);
if (result == MessageDialogResult.Affirmative)
{
//Do something
}
Кстати, если методу, вызывающему ShowMessage()
, нужен результат, вы ОБЯЗАТЕЛЬНО ставите async
в присваивании, иначе он не будет работать. (если вы хотите показать только диалоговое окно сообщения, в этом нет необходимости).
В моем проекте используется Framework 4.0, и я могу использовать только async/await
из-за пакета, который мне пришлось установить из NuGet. Вы можете перейти по этой ссылке на документацию MSDN по этому пакету и скачать пакет здесь.
Я надеюсь, что это решило вашу проблему.
ИЗМЕНИТЬ:
Я реализовал метод на своем DialogService
для открытия любых окон из любой ViewModel. Этот метод использует структуру Microsoft Unity
для создания экземпляра моего объекта, а затем я вызываю Show()
, чтобы открыть себя. Перед вызовом Show()
я добавляю это окно в список.
Смотрите мой код:
public void ShowView<T>(params ParameterOverride[] parameter)
{
var window = UnityServiceConfigurator.Instance.Container.Resolve<T>(parameter) as MetroWindow;
if (window != null)
{
if (Application.Current.MainWindow != window)
{
window.Owner = Application.Current.MainWindow;
var ownerMetroWindow = (window.Owner as MetroWindow);
if (!ownerMetroWindow.IsOverlayVisible())
ownerMetroWindow.ShowOverlayAsync();
}
if (!_openedViews.Contains(window))
_openedViews.Add(window);
window.Show();
}
}
Вот как я звоню из своей ViewModel:
_dialog.ShowView<MyView>();
Если у вас есть только одно окно во всем программном обеспечении, вы можете сохранить его ссылку и использовать его для отображения ShowMessageAsync()
без необходимости создавать список только для использования первого. Как это:
var metroWindow = (Application.Current.MainWindow as MetroWindow);
person
Guilherme Oliveira
schedule
03.03.2014