Global Using 클래스 파일 추가하면
using도 줄일 수 있고 Grid 관련 Columns.Define, Rows.Define 처리할 때 인테리센스를 이용할 수 있으니
매번 사용하는 Using은 미리 등록하시는걸 추천드립니다.
// MVVM Toolkit
// .NET MAUI Markup
global using LukeMauiMarkup;
global using LukeMauiMarkup.Exentions;
global using CommunityToolkit.Maui.Markup;
global using CommunityToolkit.Mvvm.ComponentModel;
global using CommunityToolkit.Mvvm.Input;
// Static
global using static CommunityToolkit.Maui.Markup.GridRowsColumns;
global using static Microsoft.Maui.Graphics.Colors;
global using MC = Microsoft.Maui.Controls;
위와 같이 TryGetModalStackPage함수(기존 HotReload 예제) 를 응용하여 ModalStack의 마지막 페이지를 불러와서 Build함수 실행하는 것으로 해결하였습니다.
알게된 점
WPF와 MAUI는 비슷하다!?
@jamesnet214 님께서 항상 말씀하신 CustomControl(사용자지정컨트롤)의 중요성에 깊이 공감하고 있기 때문에 자연스럽게 Maui와 접점 부분이 있는지 조금이나마 관심유지하며 지켜보고 있었습니다.
그러다 이번 Slog를 통해 Popup 라이브러리 소스 분석 중 WPF와 비슷한점을 발견하였습니다.
Maui에서 WPF의 각 컨트롤마다 속성을 지우고 다시 그릴 수 있는 Template 이 없는 줄 알았는데
ControlTemplate이 그 기능을 하고 대체하고 있다는 것을 알게 되었습니다.
ControlTemplate는 ContentPage와 ContentView 존재하였습니다.
하지만 아쉽게도.. Maui에서 ContentPage와 ContentView, 특정컨트롤(RadioButton) 외 다른 컨트롤에서는 ControlTemplate들이 존재하지 않았습니다.
ControlTemplate은 Page와 Layout의 고유 BindableProperty로 존재하는 반면
다른 컨트롤은 특별하지 않는 이상 상위계층이 전부 View로 상속받고 있기 때문입니다.
하지만 위에서 언급한 특정컨트롤 인 RadioButton은 ControlView와 같은 Layout을 상속받고 있는것을 보았습니다.
RadioButton는 커스텀을 통해 만들어진 컨트롤이라는 것을 알게 되었습니다.
(점점 파고들다보니 내용이 길어질 거 같아 다음 기회에 다른 게시글을 통해..공유하는것으로하겠습니다.)
(추측) 팝업창으로 만들어진 ContentPage는 왜 변경되지 않을까?
대게 라이브러리로 만들어진 Popup은 호출 시 PushModal 방식으로 Page를 띄웁니다.
제가 HotReload 구현했을 때 이슈와 비슷한 상황으로 PushModal의 경우 띄어진 ContentPage는 NavigationPage의 CurrentPage에 해당되지 않기 때문에 HotReload가 동작되지 않는것으로 파악됩니다.
매개변수 params을 활용한 선언형방식(Content, Children, ColumnsDefinitions, RowDefinitions)
LukeMauiMarkup Template Nuget 반영
매개변수 params을 활용한 선언형방식
// 기존코드
public override void Build()
{
Content = new Grid()
{
RowDefinitions = Rows.Define(Auto, Star)
Children =
{
new Label()
.Row(0)
.Text("Welcome to .NET MAUI!!!"),
new Label()
.Row(1)
.Text("Welcome to .NET MAUI!!!")
}
}
.BackgroundColor(Colors.Red);
}
// 개선코드
public override void Build()
{
this.Content(
new Grid()
.RowDefinitions (Auto, Star)
.Children(
new Label()
.Row(0)
.Text("Welcome to .NET MAUI!!!"),
new Label()
.Row(1)
.Text("Welcome to .NET MAUI!!!")
)
)
.BackgroundColor(Colors.Red);
}
LukeMauiMarkup Template Nuget 반영
설치방법
dotnet new install LukeMauiMarkup.Templates::1.0.0