C# UI 및 .NET 핫 리로드 - .NET MAUI에서 만들어진 매치
대부분의 경우 .NET MAUI에서는 XAML을 사용하여 UI를 선언하고 XAML Hot Reload를 사용하여 반복적인 중지 및 시작을 방지합니다. 이것은 정말 잘 작동할 수 있습니다. XAML 편집을 수행할 때마다 XAML 컴파일러가 편집이 유효한 코드임을 나타내면 변경 내용이 실행 중인 앱으로 전달되고 상태를 유지하면서 UI가 업데이트됩니다.
XAML에서 세션을 중지했다가 다시 시작해야 하므로 흐름이 끊기는 경우가 많습니다. C#을 완전히 유지하면 이 상황이 크게 개선됩니다.
C# UI와 .NET 핫 리로드 결합
C#에서 UI 코드를 편집할 때 해당 코드를 다시 실행하고 변경의 영향을 확인하기 위해 무언가를 수행해야 합니다. 피곤해질 수 있습니다. 제가 하는 일은 다음과 같습니다.
Build
메서드에 UI 구성을 배치하는 패턴이 마음에 듭니다. 이 메서드는 ContentPage.Content
를 설정하고 OnNavigatedTo
또는 Shell
내에서 호스팅될 때 페이지의 NavigationPage
메서드에서 호출됩니다.void Build() => Content =
new Grid {
};
protected override void OnNavigatedTo(NavigatedToEventArgs args)
{
base.OnNavigatedTo(args);
Build();
}
엄청난! 하지만 이 메서드는 한 번만 호출됩니다. 해당 페이지에서 벗어나 다시 돌아올 수 있습니다. 또는 방법을 수동으로 트리거하는 제스처를 추가할 수 있습니다. 그것은 빨리 늙습니다.
XAML 핫 리로드와 유사하게 핫 리로드를 트리거할 때마다
Build()
메서드를 확인할 수 있다면 어떨까요?할 수 있다는 것이 밝혀졌습니다! .NET Hot Reload가 실행될 때마다 메타데이터 변경이 트리거되고 이에 연결할 수 있습니다. 이를 위해 프로젝트에 HotReloadService.cs를 추가합니다.
#if DEBUG
[assembly: System.Reflection.Metadata.MetadataUpdateHandlerAttribute(typeof(YourAppNamespace.HotReloadService))]
namespace YourAppNamespace {
public static class HotReloadService
{
#pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
public static event Action<Type[]?>? UpdateApplicationEvent;
#pragma warning restore CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
internal static void ClearCache(Type[]? types) { }
internal static void UpdateApplication(Type[]? types) {
UpdateApplicationEvent?.Invoke(types);
}
}
}
#endif
변경 사항이 발생할 때마다 앱은 이제 이벤트를 전달합니다. 현재 작업 중인 파일에서 빌드를 다시 실행하려는 경우 이벤트를 처리합니다.
protected override void OnNavigatedTo(NavigatedToEventArgs args)
{
base.OnNavigatedTo(args);
Build();
#if DEBUG
HotReloadService.UpdateApplicationEvent += ReloadUI;
#endif
}
protected override void OnNavigatedFrom(NavigatedFromEventArgs args)
{
base.OnNavigatedFrom(args);
#if DEBUG
HotReloadService.UpdateApplicationEvent -= ReloadUI;
#endif
}
private void ReloadUI(Type[] obj)
{
MainThread.BeginInvokeOnMainThread(() =>
{
Build();
});
}
이제 시도해 보세요! 해당 페이지에서 C#을 변경하고 핫 리로드 실행 버튼을 누르십시오(또는 저와 같은 경우 저장 시 실행되도록 핫 리로드를 설정하십시오). 팔!
XAML Hot Reload must be enabled to leverage this event since it works over the same tooling service. If you disable XAML Hot Reload, then your C# code will reload, but you won't receive the event that you have wired up now to trigger a UI rebuild.
디버깅 세션을 실제로 중지했다가 다시 시작해야 하는 시나리오는 지금까지 거의 발견되지 않았습니다. 이 영상을 보시면 아시겠지만 저는 새로운 클래스 파일까지 멈추지 않고 추가합니다.
Reference
이 문제에 관하여(C# UI 및 .NET 핫 리로드 - .NET MAUI에서 만들어진 매치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/davidortinau/c-ui-and-net-hot-reload-a-match-made-in-net-maui-243f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)