[WPF] [XAML] MahApps.Metro 대화 상자를 사용해보기
MahApps.Metro 대화 상자를 사용해보기
개발 환경
처음에
WPF로 싱글 페이지 어플리케이션을 작성하고 있어도, 역시 다이얼로그 표시가 하고 싶다! 시간이 있니?
하지만, 입력계의 다이얼로그라면, 개인적으로는, 커스텀 다이얼로그가 아니고, 플라이아웃을 추천합니다만, 처리 종료 메세지는, 역시 다이얼로그로 하고 싶다고 때로는, MahApps.Metro에는, Metro풍 대화 상자가 있으므로 그것을 사용해 보는 것은 어떻습니까?
MahApps.Metro의 대화 컨트롤
※MahApps의 프로젝트에 NuGet 추가 등의 설명은 생략
MahApps.Metro Dialogs
MahApps.Metro에는 메시지 대화 상자와 진행 대화 상자가 있습니다.
사용법으로서는, 비동기 실행할 수 있으므로
async/await
를 붙인 다음에, 각각 기술은 이하와 같이 됩니다.메시지 대화 상자의 경우
await this.ShowMessageAsync("This is the title", "Some message");
진행 대화상자의 경우
var controller = await this.ShowProgressAsync("Please wait...", "Progress message");
MVVM에서는 여전히 오류가 발생합니다.
코드 숨김으로 작성된 경우 그대로 사용할 수 있지만,
Prism + Unity를 사용한 MVVM 복합 애플리케이션의 경우 UserControl 또는 Page의 ViewModel에 처리를 설명하기 때문에 위의 쓰기에서는 오류가 발생합니다.
이것은 MetroWindow 확장 프로그램에서 각 메시지 대화 상자로 인해 UserControl 및 Page에서 오류가 발생합니다.
MVVM의 경우 공식 페이지에서 IDialogCoordinator를 사용하여 예제가 나와 있습니다.
Support for viewmodels
You can open dialogs from your viewmodel by using the IDialogCoordinator.
Add the following code to your Window.xaml or UserControl.xaml:
MVVM의 지굴에서 무너질 것입니다.
원래 M+V+VM에서는 역할을 나누자는 것으로 직접 View에 대한 지정은 하지 않습니다만,
단순히 대화 상자는 MetroWindow에서 호출되므로 다음과 같은 방법으로도 볼 수 있습니다.
public MetroWindow Metro { get; set; }
에서 속성을 만들고 현재 MetroWindow를 저장합니다.Metro.ShowMessageAsync("This is the title", "Some message");
저장된 Metro의 ShowMessageAsync를 지정합니다. MainUcViewModel.cs
/// <summary>
/// MetroWindow
/// </summary>
public MetroWindow Metro { get; set; } = System.Windows.Application.Current.MainWindow as MetroWindow;
MainUcViewModel.cs
/// <summary>
/// メッセージダイアログ コマンド
/// </summary>
private DelegateCommand showMessageCommand;
public DelegateCommand ShowMessageCommand =>
showMessageCommand ?? (showMessageCommand = new DelegateCommand(ShowMessageCommandExecute));
/// <summary>
/// メッセージダイアログ表示処理
/// </summary>
private async void ShowMessageCommandExecute()
{
await Metro.ShowMessageAsync("This is the title", "Some message");
}
MainUcViewModel.cs
/// <summary>
/// プログレスダイアログ コマンド
/// </summary>
private DelegateCommand showProgressCommand;
public DelegateCommand ShowProgressCommand =>
showProgressCommand ?? (showProgressCommand = new DelegateCommand(ShowProgressCommandExecute));
/// <summary>
/// プログレスダイアログ表示処理
/// </summary>
private async void ShowProgressCommandExecute()
{
var controller = await Metro.ShowProgressAsync("Please wait...", "Progress message");
for (var i = 0; i < 10; i++)
{
controller.SetProgress(1.0 / 10 * i);
await Task.Delay(100);
}
await controller.CloseAsync();
}
실행 결과
요약
MVVM 복합 애플리케이션에서도 MahApps.Metro 대화 상자를 사용하는 경우 공식적으로
IDialogCoordinator
를 사용하는 것이 좋을 것입니다.Window 자체는, 특히 고정으로 View명을 지정한 것은 아니기 때문에, 이 정도는 허용 범위일까라고 개인적으로는 생각합니다.
이미 Qiita 내에서도 ViewModel에서 표시하는 IDialogCoordinator를 사용한 방법을 게시된 분이 이미 계셨습니다.
soi 님의 게시물
WPF로 갈 수있는 대화 상자를 내는 방법
이쪽을 참고로 하는 편이 좋을지도?
보충 정보
/// <summary>
/// メッセージダイアログ表示処理
/// </summary>
private async void ShowMessageCommandExecute()
{
var metroDialogSettings = new MetroDialogSettings()
{
AffirmativeButtonText = "はい",
NegativeButtonText = "いいえ",
AnimateHide = true,
AnimateShow = true,
ColorScheme = MetroDialogColorScheme.Theme,
};
var diagResult = await Metro.ShowMessageAsync("This is the title", "Some message", MessageDialogStyle.AffirmativeAndNegative, metroDialogSettings);
Console.WriteLine(diagResult);
}
Reference
이 문제에 관하여([WPF] [XAML] MahApps.Metro 대화 상자를 사용해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/HAGITAKO/items/c43b6cfe0e0d86ad1410텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)