Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Grundläggande användning
Om du vill använda .NET Hot Reload när du aktivt felsöker din .NET MAUI-app ändrar du C#-koden och klickar sedan på knappen Apply Code Changes (aka knappen 🔥) i verktygsfältet Visual Studio.
Varning
När du ändrar UI-kod uppdaterar knappen Tillämpa kodändringar (även kallad 🔥 knappen) C#-koden som körs omedelbart, men det kanske inte uppdaterar användargränssnittet omedelbart (se Avancerad användning). Det beror på att .NET MAUI inte är medvetet om de underliggande ändringar som du just har gjort i den körande Intermediate Language-koden.
Den goda nyheten är att koden som körs verkligen har uppdaterats, och vi behöver bara säga till .NET MAUI att rita om det uppdaterade användargränssnittet på skärmen
En enkel lösning är att tvinga .NET MAUI att uppdatera användargränssnittet genom att navigera bort från den aktuella sidan där den .NET Hot Reload ändringen tillämpades och sedan navigera tillbaka till den sidan. Detta tvingar .NET MAUI att rita om användargränssnittet på skärmen.
Se Avancerad användning för mer information om hur du automatiskt uppmanar .NET MAUI att rita om det uppdaterade användargränssnittet.
Avancerad användning
Det finns en lucka i det .NET ekosystemet mellan .NET MAUI och .NET Hot Reload: ditt .NET MAUI appgränssnitt uppdateras inte automatiskt när du har tryckt på knappen Apply Code Changes (även kallat knappen 🔥). Även om koden har uppdaterats i appens underliggande Intermediate Language har inget sagt .NET MAUI att rita om det uppdaterade användargränssnittet på skärmen.
Den goda nyheten är att vi manuellt kan be .NET MAUI att rita om användargränssnittet genom att implementera ICommunityToolkitHotReloadHandler och registrera det med .NET MAUI beroendeinmatningscontainer (example nedan).
MetadataUpdateHandler
När .NET Hot Reload körs visar den varje uppdaterad Type genom att ange en Type[] via System.Reflection.Metadata.MetadataUpdateHandler.
.NET MAUI C# Markup Community Toolkit exponerar de ändrade typerna via ICommunityToolkitHotReloadHandler.OnHotReload(IReadOnlyList<Type> types).
Genom att registrera implementeringen av ICommunityToolkitHotReloadHandler med .NET MAUI beroendeinmatningscontainer kommer metoden OnHotReload automatiskt att utlösas varje gång Apply Code Changes-knappen (även kallat knappen 🔥) trycks på:
builder.Services.AddSingleton<ICommunityToolkitHotReloadHandler, HotReloadHandler>();
Exempel på implementering av ICommunityToolkitHotReloadHandler
Det här exemplet visar hur du implementerar ICommunityToolkitHotReloadHandler för att instruera .NET MAUI att automatiskt rita om appens användargränssnitt när knappen Apply Code Changes (även kallat knappen 🔥) trycks.
Note
Det här är inte ett omfattande exempel som fungerar för varje app. Det här exemplet fungerar för de flesta appar, men eftersom varje .NET MAUI app är konstruerad och implementerad på olika sätt rekommenderar vi att du ändrar exempelkoden så att den fungerar bäst för din kodbas.
MauiProgram.cs
I filen MauiProgram.cs lägger du till din implementering av ICommunityToolkitHotReloadHandler i .NET MAUI:s Dependency Injection-container:
public class MauiProgram
{
public static MauiApp CreateMauiApp()
{
// ...
// Additional code ommitted for brevity
// ...
// Register C# Hot Reload Handler
builder.Services.AddSingleton<ICommunityToolkitHotReloadHandler, HotReloadHandler>();
// ...
// Additional code ommitted for brevity
// ...
}
}
HotReloadHandler.cs
I implementeringen av ICommunityToolkitHotReloadHandler uppmanar vi .NET MAUI att rita om användargränssnittet på skärmen.
Exemplet nedan hanterar både Shell- och icke-Shell-arkitekturer och innehåller stöd för sidor som visas modally.
Note
Det här är inte ett omfattande exempel som fungerar för varje app. Det här exemplet fungerar för de flesta appar, men eftersom varje .NET MAUI app är konstruerad och implementerad på olika sätt rekommenderar vi att du ändrar exempelkoden så att den fungerar bäst för din kodbas.
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
namespace CommunityToolkit.Maui.Markup.Sample;
class HotReloadHandler : ICommunityToolkitHotReloadHandler
{
public async void OnHotReload(IReadOnlyList<Type> types)
{
if (Application.Current?.Windows is null)
{
Trace.WriteLine($"{nameof(HotReloadHandler)} Failed: {nameof(Application)}.{nameof(Application.Current)}.{nameof(Application.Current.Windows)} is null");
return;
}
foreach (var window in Application.Current.Windows)
{
if (window.Page is not Page currentPage)
{
return;
}
foreach (var type in types)
{
if (type.IsSubclassOf(typeof(Page)))
{
if (window.Page is AppShell shell)
{
if (shell.CurrentPage is Page visiblePage
&& visiblePage.GetType() == type)
{
var currentPageShellRoute = AppShell.GetRoute(type);
await currentPage.Dispatcher.DispatchAsync(async () =>
{
await shell.GoToAsync(currentPageShellRoute, false);
shell.Navigation.RemovePage(visiblePage);
});
break;
}
}
else
{
if (TryGetModalStackPage(window, out var modalPage))
{
await currentPage.Dispatcher.DispatchAsync(async () =>
{
await currentPage.Navigation.PopModalAsync(false);
await currentPage.Navigation.PushModalAsync(modalPage, false);
});
}
else
{
await currentPage.Dispatcher.DispatchAsync(async () =>
{
await currentPage.Navigation.PopAsync(false);
await currentPage.Navigation.PushAsync(modalPage, false);
});
}
break;
}
}
}
}
}
static bool TryGetModalStackPage(Window window, [NotNullWhen(true)] out Page? page)
{
page = window.Navigation.ModalStack.LastOrDefault();
return page is not null;
}
}
.NET MAUI Community Toolkit