WinUI를 공부하면서 MessageDialog를 쓰려다가.. 못했다...
어떤 유튜브 영상에서는 MessageDialog를 사용하던데, WinUI 3 Gallery에는 검색도 되지 않고, learn.microsoft.com(이거 공식 문서인가요?)에서는 윈도우 10 이상에서는 MessageDialog 대신 ContentDialog를 권장한다고 한다.
그래서 ContentDialog를 사용하려다가 뭔 놈의 예외처리 때문에 자꾸 안되가지고 작성하게 되었다.
우선, 결과는 이러하다.
이하는 코드
//using문 생략
namespace WinUI_Test {
public sealed partial class MainWindow : Window {
public MainWindow() {
this.InitializeComponent();
}
private void myButton_Click(object sender, RoutedEventArgs e) {
dialogUp();
myButton.Content = "Clicked";
}
private async void dialogUp() {
ContentDialog dialog = new ContentDialog() {
Title = "Test",
Content = "Click buttons",
PrimaryButtonText = "OK",
CloseButtonText = "Cancel"
};
dialog.XamlRoot = myButton.XamlRoot;
await dialog.ShowAsync();
}
}
}
xmal은 처음 프로젝트를 만들 때 기본적으로 만들어지는 것으로 사용했다.
이 중 가장 중요한 것은 생성한 dialog에 XamlRoot를 꼭 지정해줘야 한댄다. 안 그러면 작동을 안 한다고
이렇게 작성하여 버튼을 누를 때의 값을 전달할 수도 있다.
private async void myButton_Click(object sender, RoutedEventArgs e) {
if(await dialogUp()) {
myButton.Content = "Clicked";
}
}
private async Task<bool> dialogUp() {
bool result = false;
ContentDialog dialog = new ContentDialog() {
Title = "Test",
Content = "Click buttons",
PrimaryButtonText = "OK",
CloseButtonText = "Cancel"
};
//버튼 클릭을 추가할 때 꼭 매개변수가 2개 들어가야 한다네요
dialog.PrimaryButtonClick += (_s, _e) => { result = true; };
dialog.XamlRoot = myButton.XamlRoot;
await dialog.ShowAsync();
return result;
}
하지만!
여기서 만족하고 싶지 않았다.
WinUI3 갤러리에 나오는 예시처럼 dialog에 뭔가 예쁘게 집어넣어보고 싶었다.
이렇게 갤러리에서는 제공이 되었으나..
새 페이지를 만들어 그 안에 위의 코드를 넣었으나...
왜인지는 몰라도 자꾸 await dialog.ShowAsync()에서 처리되지 않은 예외라며 다이얼로그가 나타나지 않았다
인터넷을 뒤져보니 다들 XamlRoot가 잘못되었다고 말을 하니 이 코드에서도 XamlRoot가 잘못 되었겠거니 싶겠는데,
뭐가 잘못되었는지 잘 모르겠다
혹시 이에 대해 아시는 분이 계신다면 댓글로 알려주시면 감사하겠습니다
2023.01.23 18:20 추가작성
XamlRoot에 대해 착각하고 있었던 것 같다.
XamlRoot는 띄울 창에 어떤 내용을 넣을까가 아니라, 어디 창에 이걸 띄울까인 것 같다. (추측)
즉, 위 코드의 dialog.XamlRoot에는 Page의 XamlRoot가 아닌 다이얼로그를 띄울 MainWindow의 XamlRoot를 넣어줘야 작동하는 것이다.
그래서 아래와 같이 코드를 작성했고,
(다이얼로그의 내용물은 Content로 추가해야 하나보다)
// BlankPage1.xaml.cs
public async void Show(XamlRoot xamlRoot) {
ContentDialog dialog = new ContentDialog() {
PrimaryButtonText = "Save",
CloseButtonText = "Cancel",
Title = "테스트",
XamlRoot = xamlRoot,
Content = new BlankPage1()
};
var result = await dialog.ShowAsync();
}
// MainWindow.xaml.cs
private void myButton_Click(object sender, RoutedEventArgs e) {
BlankPage1 page = new BlankPage1();
page.Show(this.Content.XamlRoot);
}
(MainWindow의 XamlRoot를 매개변수로 전달)
오류없이 다이얼로그 창이 뜬 것을 확인할 수 있었...... 읭?
체크박스도 보이고, 다이얼로그의 타이틀도 잘 나오는데... 아무래도 xaml에 입력한 한글이 깨진 것 같다.
한글은 나중에 해결해봐야겠다
'C# > WinUI3' 카테고리의 다른 글
[WinUI3] ToDo리스트 만들기 - 포기 (0) | 2023.01.26 |
---|---|
[WinUI3] ToDo리스트 만들기(2) (0) | 2023.01.24 |
[WinUI3] ToDo리스트 만들기(1) (0) | 2023.01.24 |
Xaml에서 한글 입력 시 깨질 때 (0) | 2023.01.23 |
[WinUI3] 설치하기 (0) | 2023.01.23 |