Novinky v .NET MAUI pro .NET 9
Cílem rozhraní .NET Multi-Platform App UI (.NET MAUI) v .NET 9 je zlepšit kvalitu produktu. To zahrnuje rozšíření pokrytí testů, kompletní testování scénářů a opravu chyb. Další informace o vylepšení kvality produktu v rozhraní .NET MAUI 9 najdete v následujících poznámkách k verzi:
- .NET MAUI 9
- .NET MAUI 9 RC2
- .NET MAUI 9 RC1
- .NET MAUI 9 Preview 7
- .NET MAUI 9 Preview 6
- .NET MAUI 9 Preview 5
- .NET MAUI 9 Preview 4
- .NET MAUI 9 Preview 3
- .NET MAUI 9 Preview 2
- .NET MAUI 9 Preview 1
Důležité
Kvůli práci s externími závislostmi, jako jsou Xcode nebo Nástroje sady Android SDK, se zásady podpory .NET MAUI liší od zásad podpory .NET a .NET Core. Další informace najdete v tématu Zásady podpory .NET MAUI.
Při sestavování pomocí .NET MAUI 9 se vyžaduje kompatibilita s Xcode 16, která zahrnuje podporu sady SDK pro iOS 18, iPadOS 18, tvOS 18 a macOS 15. Xcode 16 vyžaduje Mac se systémem macOS 14.5 nebo novějším.
V .NET 9 se .NET MAUI dodává jako úloha .NET a několik balíčků NuGet. Výhodou tohoto přístupu je, že umožňuje snadno připnout projekty na konkrétní verze a zároveň vám umožní snadno zobrazit náhled nerelevidovaných nebo experimentálních buildů. Když vytvoříte nový projekt .NET MAUI, do projektu se automaticky přidají požadované balíčky NuGet.
Minimální cíle nasazení
.NET MAUI 9 vyžaduje minimální cíle nasazení iOS 12.2 a Mac Catalyst 15.0 (macOS 12.0). Minimální cíle nasazení pro Android a Windows zůstávají stejné. Další informace najdete v tématu Podporované platformy pro aplikace .NET MAUI.
Nové ovládací prvky
.NET MAUI 9 obsahuje dva nové ovládací prvky.
HybridWebView
HybridWebView umožňuje hostování libovolného obsahu HTML/JS/CSS ve webovém zobrazení a umožňuje komunikaci mezi kódem ve webovém zobrazení (JavaScript) a kódem, který je hostitelem webového zobrazení (C#/.NET). Pokud máte například existující aplikaci React JS, můžete ji hostovat v nativní aplikaci .NET MAUI pro různé platformy a vytvořit back-end aplikace pomocí C# a .NET.
K vytvoření aplikace HybridWebView .NET MAUI potřebujete:
- Webový obsah aplikace, který se skládá ze statického HTML, JavaScriptu, CSS, obrázků a dalších souborů.
- Ovládací HybridWebView prvek jako součást uživatelského rozhraní aplikace. Toho lze dosáhnout tak, že na ni odkazujete v kódu XAML aplikace.
- Kód ve webovém obsahu a v jazyce C#/.NET, který používá HybridWebView rozhraní API k odesílání zpráv mezi dvěma komponentami.
Celá aplikace, včetně webového obsahu, je zabalená a běží místně na zařízení a je možné ji publikovat do příslušných obchodů s aplikacemi. Webový obsah je hostovaný v nativním ovládacím prvku webového zobrazení a běží v kontextu aplikace. Každá část aplikace má přístup k externím webovým službám, ale nevyžaduje se.
Další informace naleznete v tématu HybridWebView.
Záhlaví pro Windows
Ovládací TitleBar prvek umožňuje přidat do aplikace ve Windows vlastní záhlaví:
Vlastnost TitleBar lze nastavit jako hodnotu Window.TitleBar vlastnosti na libovolném TitleBar:
<Window.TitleBar>
<TitleBar x:Name="TeamsTitleBar"
Title="Hello World"
Icon="appicon.png"
HeightRequest="46">
<TitleBar.Content>
<SearchBar Placeholder="Search"
PlaceholderColor="White"
MaximumWidthRequest="300"
HorizontalOptions="Fill"
VerticalOptions="Center" />
</TitleBar.Content>
</TitleBar>
</Window.TitleBar>
Příkladem použití v jazyce C# je:
Window window = new Window
{
TitleBar = new TitleBar
{
Icon = "titlebar_icon.png"
Title = "My App",
Subtitle = "Demo"
Content = new SearchBar { ... }
}
};
A TitleBar je vysoce přizpůsobitelné prostřednictvím jeho Content, LeadingContenta TrailingContent vlastnosti:
<TitleBar Title="My App"
BackgroundColor="#512BD4"
HeightRequest="48">
<TitleBar.Content>
<SearchBar Placeholder="Search"
MaximumWidthRequest="300"
HorizontalOptions="Fill"
VerticalOptions="Center" />
</TitleBar.Content>
<TitleBar.TrailingContent>
<ImageButton HeightRequest="36"
WidthRequest="36"
BorderWidth="0"
Background="Transparent">
<ImageButton.Source>
<FontImageSource Size="16"
Glyph=""
FontFamily="SegoeMDL2"/>
</ImageButton.Source>
</ImageButton>
</TitleBar.TrailingContent>
</TitleBar>
Následující snímek obrazovky ukazuje výsledný vzhled:
Poznámka:
Podpora Mac Catalyst pro TitleBar
ovládací prvek bude přidána v budoucí verzi.
Další informace naleznete v tématu TitleBar.
Vylepšení ovládacích prvků
.NET MAUI 9 zahrnuje vylepšení ovládacích prvků.
Režim vazby BackButtonBehavior OneWay
Režim vazby pro IsVisible
a IsEnabled
v BackButtonBehavior aplikaci shellu je teď BindingMode.OneWay
místo BindingMode.OneTime
. Díky tomu můžete snadněji řídit chování tlačítka Zpět za běhu pomocí datových vazeb:
<ContentPage ...>
<Shell.BackButtonBehavior>
<BackButtonBehavior Command="{Binding BackCommand}"
IsVisible="{Binding IsBackButtonVisible}"
IconOverride="back.png" />
</Shell.BackButtonBehavior>
...
</ContentPage>
BlazorWebView
Výchozí chování pro hostování obsahu v BlazorWebView se změnilo na 0.0.0.1
. Interní 0.0.0.0
adresa použitá k hostování obsahu už nefunguje a výsledkem BlazorWebView není načtení žádného obsahu a vykreslení jako prázdný obdélník.
Pokud se chcete přihlásit k používání 0.0.0.0
adresy, přidejte do metody v CreateMauiApp
MauiProgram.cs následující kód:
// Set this switch to use the LEGACY behavior of always using 0.0.0.0 to host BlazorWebView
AppContext.SetSwitch("BlazorWebView.AppHostAddressAlways0000", true);
Ve výchozím nastavení se BlazorWebView aktivuje a zapomene asynchronní odstranění podkladu WebViewManager
. Tím se snižuje potenciál zablokování pro odstranění v Androidu.
Upozorňující
Toto výchozí chování typu fire-and-forget znamená, že odstranění může vrátit před odstraněním všech objektů, což může způsobit změny chování ve vaší aplikaci. Uvolněné položky jsou částečně vlastními interními typy Blazoru, ale také typy definované aplikací, jako jsou služby s vymezeným oborem používané v BlazorWebView rámci části vaší aplikace.
Pokud se chcete z tohoto chování odhlásit, měli byste nakonfigurovat aplikaci tak, aby blokovala odstranění prostřednictvím AppContext přepínače v CreateMauiApp
metodě ve vaší MauiProgram
třídě:
AppContext.SetSwitch("BlazorWebView.AndroidFireAndForgetAsync", false);
Pokud je vaše aplikace nakonfigurovaná tak, aby blokovala odstranění prostřednictvím tohoto přepínače, BlazorWebView provede async-over-sync dispose, což znamená, že blokuje vlákno, dokud se asynchronní odstranění neskončí. To však může způsobit zablokování, pokud je potřeba k odstranění spustit kód ve stejném vlákně (protože vlákno je blokováno při čekání).
Tlačítka v iOSu
Button ovládací prvky v iOSu teď respektují mezery, odsazení, šířku ohraničení a okraje přesněji než v předchozích verzích. Velikost velkého obrázku v obrázku Button se teď změní na maximální velikost, a to s ohledem na mezery, odsazení, šířku ohraničení a okraje. Pokud Button ale obsahuje text a obrázek, nemusí být možné přizpůsobit veškerý obsah uvnitř tlačítka, a proto byste měli obrázek upravit ručně, abyste dosáhli požadovaného rozložení.
CollectionView a CarouselView
.NET MAUI 9 obsahuje dva volitelné nové obslužné rutiny v iOSu a Mac Catalyst, které přinášejí vylepšení výkonu a stability a CollectionView
CarouselView
. Tyto obslužné rutiny jsou založené na UICollectionView
rozhraních API.
Pokud se chcete přihlásit k používání těchto obslužných rutin, přidejte do své MauiProgram
třídy následující kód:
#if IOS || MACCATALYST
builder.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler<Microsoft.Maui.Controls.CollectionView, Microsoft.Maui.Controls.Handlers.Items2.CollectionViewHandler2>();
handlers.AddHandler<Microsoft.Maui.Controls.CarouselView, Microsoft.Maui.Controls.Handlers.Items2.CarouselViewHandler2>();
});
#endif
ContentPage
V rozhraní .NET MAUI 9 je vlastnost HideSoftInputOnTapped podporována také v systému Mac Catalyst a Android a iOS.
Podpora softwarového zadávání klávesnice
.NET MAUI 9 přidává novou podporu vstupu soft keyboard pro Password
, Date
a Time
. Tyto možnosti můžou být povolené Editor u a Entry ovládacích prvcích:
<Entry Keyboard="Date" />
Zarovnání textu
Výčet TextAlignment přidá Justify
člena, který lze použít k zarovnání textu v textových ovládacích prvcích. Text můžete například vodorovně zarovnat takto LabelHorizontalTextAlignment.Justify
:
<Label Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. In facilisis nulla eu felis fringilla vulputate."
HorizontalTextAlignment="Justify"/>
TimePicker
TimePicker
TimeSelected získá událost, která se vyvolá při změně vybraného času. Objekt TimeChangedEventArgs , který doprovází TimeSelected
událost, má NewTime
a OldTime
vlastnosti, které určují nový a starý čas, v uvedeném pořadí.
WebView
WebView
ProcessTerminated
přidá událost, která se vyvolá, když WebView proces neočekávaně skončí. Objekt WebViewProcessTerminatedEventArgs
, který doprovází tuto událost, definuje vlastnosti specifické pro platformu, které označují, proč proces selhal.
Kompilované vazby v kódu
Vazby napsané v kódu obvykle používají cesty řetězců, které jsou vyřešeny za běhu s reflexí a režijní náklady se liší od platformy po platformu. .NET MAUI 9 zavádí další SetBinding metodu rozšíření, která definuje vazby pomocí argumentu Func
místo cesty řetězce:
// in .NET 8
MyLabel.SetBinding(Label.TextProperty, "Text");
// in .NET 9
MyLabel.SetBinding(Label.TextProperty, static (Entry entry) => entry.Text);
Tento zkompilovaný přístup vazby nabízí následující výhody:
- Vylepšili jsme výkon datových vazeb překladem výrazů vazeb v době kompilace místo modulu runtime.
- Lepší prostředí pro řešení potíží pro vývojáře, protože neplatné vazby jsou hlášeny jako chyby sestavení.
- IntelliSense při úpravách
Ne všechny metody lze použít k definování kompilované vazby. Výraz musí být jednoduchý přístupový výraz vlastnosti. Následující příklady ukazují platné a neplatné vazbové výrazy:
// Valid: Property access
static (PersonViewModel vm) => vm.Name;
static (PersonViewModel vm) => vm.Address?.Street;
// Valid: Array and indexer access
static (PersonViewModel vm) => vm.PhoneNumbers[0];
static (PersonViewModel vm) => vm.Config["Font"];
// Valid: Casts
static (Label label) => (label.BindingContext as PersonViewModel).Name;
static (Label label) => ((PersonViewModel)label.BindingContext).Name;
// Invalid: Method calls
static (PersonViewModel vm) => vm.GetAddress();
static (PersonViewModel vm) => vm.Address?.ToString();
// Invalid: Complex expressions
static (PersonViewModel vm) => vm.Address?.Street + " " + vm.Address?.City;
static (PersonViewModel vm) => $"Name: {vm.Name}";
Upozorňující
K chybě kompilátoru CS0272 dojde, pokud je přístupový objekt sady pro vlastnost nebo indexer nepřístupný. Pokud k tomu dojde, zvyšte přístupnost přístupového objektu.
Kromě toho .NET MAUI 9 přidá metodu BindingBase.Create , která nastaví vazbu přímo na objektu pomocí a Func
vrátí instanci objektu vazby:
// in .NET 8
myEntry.SetBinding(Entry.TextProperty, new MultiBinding
{
Bindings = new Collection<BindingBase>
{
new Binding(nameof(Entry.FontFamily), source: RelativeBindingSource.Self),
new Binding(nameof(Entry.FontSize), source: RelativeBindingSource.Self),
new Binding(nameof(Entry.FontAttributes), source: RelativeBindingSource.Self),
},
Converter = new StringConcatenationConverter()
});
// in .NET 9
myEntry.SetBinding(Entry.TextProperty, new MultiBinding
{
Bindings = new Collection<BindingBase>
{
Binding.Create(static (Entry entry) => entry.FontFamily, source: RelativeBindingSource.Self),
Binding.Create(static (Entry entry) => entry.FontSize, source: RelativeBindingSource.Self),
Binding.Create(static (Entry entry) => entry.FontAttributes, source: RelativeBindingSource.Self),
},
Converter = new StringConcatenationConverter()
});
Důležité
Kompilované vazby jsou vyžadovány místo vazeb založených na řetězcích v aplikacích NativeAOT a v aplikacích s povoleným úplným oříznutím.
Další informace o zkompilovaných vazbách v kódu naleznete v tématu Kompilované vazby v kódu.
Kompilované vazby v XAML
V .NET MAUI 8 jsou kompilované vazby zakázány pro všechny výrazy vazby XAML, které definují Source
vlastnost, a nejsou podporovány u více vazeb. Tato omezení byla odebrána v rozhraní .NET MAUI 9. Informace o kompilaci výrazů vazby XAML, které definují Source
vlastnost, naleznete v tématu Kompilace vazeb, které definují Source
vlastnost.
Ve výchozím nastavení .NET MAUI 9 vytváří upozornění sestavení pro vazby, které nepoužívají kompilované vazby. Další informace o upozorněních kompilovaných vazeb XAML naleznete v upozorněních kompilovaných vazeb XAML.
Injektáž závislostí
V aplikaci Shell už nemusíte registrovat stránky do kontejneru injektáže závislostí, pokud nechcete ovlivnit životnost stránky vzhledem ke kontejneru pomocí AddSingleton
AddTransient
, nebo AddScoped
metod. Další informace o těchto metodách najdete v tématu Životnost závislostí.
Odpojení obslužné rutiny
Při implementaci vlastního ovládacího prvku pomocí obslužných rutin je každá implementace obslužné rutiny platformy nutná k implementaci DisconnectHandler() metody, k provedení jakéhokoli nativního čištění zobrazení, jako je zrušení odběru událostí. Před rozhraním .NET MAUI 9 DisconnectHandler() se však implementace záměrně nevyvolává rozhraním .NET MAUI. Místo toho byste ho museli vyvolat sami, když se rozhodnete vyčistit ovládací prvek, například při navigaci dozadu v aplikaci.
V .NET MAUI 9 se obslužné rutiny automaticky odpojí od svých ovládacích prvků, pokud je to možné, například při navigaci dozadu v aplikaci. V některých scénářích toto chování možná nebudete chtít. Proto rozhraní .NET MAUI 9 přidá připojenou HandlerProperties.DisconnectPolicy
vlastnost pro řízení, když jsou obslužné rutiny odpojeny od jejich ovládacích prvků. Tato vlastnost vyžaduje HandlerDisconnectPolicy argument s výčtem definujícím následující hodnoty:
-
Automatic
, který označuje, že obslužné rutiny budou automaticky odpojeny. Toto je výchozí hodnotaHandlerProperties.DisconnectPolicy
připojené vlastnosti. -
Manual
, což označuje, že obslužné rutiny budou muset být odpojeny ručně vyvoláním DisconnectHandler() implementace.
Následující příklad ukazuje nastavení HandlerProperties.DisconnectPolicy
připojené vlastnosti:
<controls:Video x:Name="video"
HandlerProperties.DisconnectPolicy="Manual"
Source="video.mp4"
AutoPlay="False" />
Ekvivalentní kód jazyka C# je:
Video video = new Video
{
Source = "video.mp4",
AutoPlay = false
};
HandlerProperties.SetDisconnectPolicy(video, HandlerDisconnectPolicy.Manual);
Kromě toho existuje DisconnectHandlers metoda rozšíření, která od dané IViewmetody odpojí obslužné rutiny:
video.DisconnectHandlers();
Při odpojení se DisconnectHandlers metoda rozšíří dolů řídicí strom, dokud se nedokončí nebo dorazí do ovládacího prvku, který nastavil ruční zásadu.
Podpora více oken
.NET MAUI 9 přidává možnost přenést konkrétní okno na přední straně systému Mac Catalyst a Windows metodou Application.Current.ActivateWindow
:
Application.Current?.ActivateWindow(windowToActivate);
Nativní nasazení AOT
V .NET MAUI 9 se můžete rozhodnout pro nativní nasazení AOT v systémech iOS a Mac Catalyst. Nativní nasazení AOT vytvoří aplikaci .NET MAUI, která byla předem zkompilována do nativního kódu. To přináší následující výhody:
- Zmenšená velikost balíčku aplikace, obvykle až 2,5x menší.
- Rychlejší doba spuštění, obvykle až 2x rychlejší.
- Rychlejší doba sestavení.
Další informace najdete v tématu Nativní nasazení AOT v systémech iOS a Mac Catalyst.
Nativní vkládání
.NET MAUI 9 zahrnuje úplná rozhraní API pro nativní scénáře vkládání, které bylo nutné do projektu přidat ručně:
var mauiApp = MauiProgram.CreateMauiApp();
#if ANDROID
var mauiContext = new MauiContext(mauiApp.Services, window);
#else
var mauiContext = new MauiContext(mauiApp.Services);
#endif
var mauiView = new MyMauiContent();
var nativeView = mauiView.ToPlatform(mauiContext);
Alternativně můžete použít metodu ToPlatformEmbedded
předání Window
platformy, na které je aplikace spuštěná:
var mauiApp = MauiProgram.CreateMauiApp();
var mauiView = new MyMauiContent();
var nativeView = mauiView.ToPlatformEmbedded(mauiApp, window);
V obou příkladech nativeView
je verze specifická pro platformu mauiView
.
Pokud chcete spustit nativní vloženou aplikaci v .NET MAUI 9, zavolejte metodu UseMauiEmbeddedApp
rozšíření na objektu MauiAppBuilder
:
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiEmbeddedApp<App>();
return builder.Build();
}
}
Další informace naleznete v tématu Nativní vkládání.
Šablony projektů
Šablona projektu aplikace .NET MAUI zahrnuje možnost vytvořit plně funkční aplikaci úkolů pomocí ovládacích prvků ze sady Syncfusion Toolkit pro .NET MAUI k vizualizaci dat a jejich zachování v místní databázi na základě SQLite. Pokud chcete vytvořit tuto aplikaci úkolů, vytvořte v sadě Visual Studio nový projekt pomocí šablony projektu aplikace .NET MAUI a zaškrtněte políčko Zahrnout ukázkový obsah v okně Další informace :
Aplikaci todo je možné vytvořit také z rozhraní příkazového řádku .NET s možností --sample-content
nebo -sc
možností:
dotnet new maui --sample-content -n MyProject
.NET MAUI 9 také přidá šablonu projektu .NET MAUI Blazor Hybrid a Web App do sady Visual Studio, která vytvoří řešení s hybridní aplikací .NET MAUI Blazor s webovou aplikací Blazor, která sdílí společný kód v projektu knihovny tříd Razor.
Šablonu můžete použít také z rozhraní příkazového řádku .NET:
dotnet new maui-blazor-web -n MyProject
Slovníky prostředků
V .NET MAUI 9 se jako samostatný soubor XAML ResourceDictionary (který není zálohovaný souborem kódu) standardně zkompiluje xaml. Chcete-li se odhlásit z tohoto chování, zadejte <?xaml-comp compile="false" ?>
za hlavičku XML.
Zastřihávání
Úplné oříznutí je nyní podporováno nastavením $(TrimMode)
vlastnosti MSBuild na full
hodnotu . Další informace najdete v tématu Oříznutí aplikace .NET MAUI.
Oříznutí nekompatibility
Následující funkce .NET MAUI nejsou kompatibilní s úplným oříznutím a odeberou se pomocí oříznutí:
- Vazbové výrazy, kde je tato cesta vazby nastavena na řetězec. Místo toho použijte kompilované vazby. Další informace naleznete v tématu Kompilované vazby.
- Implicitní převodní operátory při přiřazování hodnoty nekompatibilního typu vlastnosti v XAML nebo když dvě vlastnosti různých typů používají datovou vazbu. Místo toho byste měli definovat TypeConverter typ a připojit ho k typu pomocí .TypeConverterAttribute Další informace naleznete v tématu Definice TypeConverter nahradit implicitní převodní operátor.
- Načítání XAML za běhu pomocí LoadFromXaml metody rozšíření Tento KÓD XAML je možné oříznout tak, že označí všechny typy, které je možné načíst za běhu pomocí atributu
DynamicallyAccessedMembers
nebo atributuDynamicDependency
. Toto je ale velmi náchylné k chybám a nedoporučuje se. - Příjem navigačních dat pomocí funkce QueryPropertyAttribute. Místo toho byste měli implementovat IQueryAttributable rozhraní u typů, které potřebují přijímat parametry dotazu. Další informace naleznete v tématu Zpracování navigačních dat pomocí jedné metody.
- Vlastnost
SearchHandler.DisplayMemberName
. Místo toho byste měli poskytnout ItemTemplate definici vzhledu SearchHandler výsledků. Další informace najdete v tématu Definování vzhledu položky výsledků hledání. - Ovládací HybridWebView prvek, protože jeho použití dynamické
System.Text.Json
serializace funkce. - Přizpůsobení uživatelského rozhraní pomocí rozšíření XAML značek
OnPlatform
. Místo toho byste měli použít třídu OnPlatform<T>. Další informace naleznete v tématu Přizpůsobení vzhledu uživatelského rozhraní na základě platformy. - Přizpůsobení uživatelského rozhraní pomocí rozšíření
OnIdiom
XAML značek. Místo toho byste měli použít třídu OnIdiom<T>. Další informace naleznete v tématu Přizpůsobení vzhledu uživatelského rozhraní podle typu zařízení.
Přepínače funkcí oříznutí
.NET MAUI má direktivy pro oříznutí, označované jako přepínače funkcí, které umožňují zachovat kód pro funkce, které nejsou oříznuty. Tyto direktivy trimmeru lze použít, pokud $(TrimMode)
je vlastnost sestavení nastavena na full
, a také pro nativní AOT:
Vlastnost MSBuild | Popis |
---|---|
MauiEnableVisualAssemblyScanning |
Pokud je nastavená hodnota true , .NET MAUI vyhledá sestavení pro typy implementované IVisual a pro [assembly:Visual(...)] atributy a zaregistruje tyto typy. Ve výchozím nastavení je tato vlastnost sestavení nastavena, když false je povoleno úplné oříznutí. |
MauiShellSearchResultsRendererDisplayMemberNameSupported |
Pokud je nastavená hodnota false , bude hodnota SearchHandler.DisplayMemberName ignorována. Místo toho byste měli poskytnout ItemTemplate definici vzhledu SearchHandler výsledků. Ve výchozím nastavení je tato vlastnost sestavení nastavena, pokud false je povolené úplné oříznutí nebo nativní AOT. |
MauiQueryPropertyAttributeSupport |
Při nastavení na false hodnotu , [QueryProperty(...)] atributy nebudou použity k nastavení hodnot vlastností při navigaci. Místo toho byste měli implementovat IQueryAttributable rozhraní pro příjem parametrů dotazu. Ve výchozím nastavení je tato vlastnost sestavení nastavena, pokud false je povolené úplné oříznutí nebo nativní AOT. |
MauiImplicitCastOperatorsUsageViaReflectionSupport |
Při nastavení na false hodnotu .NET MAUI nebude při převodu hodnot z jednoho typu na jiný hledat implicitní převodní operátory. To může ovlivnit vazby mezi vlastnostmi s různými typy a nastavením hodnoty vlastnosti objektu bindable s hodnotou jiného typu. Místo toho byste měli definovat TypeConverter typ a připojit ho k typu pomocí atributu TypeConverterAttribute . Ve výchozím nastavení je tato vlastnost sestavení nastavena, pokud false je povolené úplné oříznutí nebo nativní AOT. |
_MauiBindingInterceptorsSupport |
Pokud je tato možnost nastavená, false nebude rozhraní .NET MAUI zachycovat žádná volání SetBinding metod a nepokouší se je zkompilovat. Ve výchozím nastavení je tato vlastnost sestavení nastavena na true . |
MauiEnableXamlCBindingWithSourceCompilation |
Když nastavíte hodnotu true , .NET MAUI zkompiluje všechny vazby, včetně těch, ve kterých Source se vlastnost používá. Pokud tuto funkci povolíte, ujistěte se, že jsou všechny vazby správné x:DataType , aby se zkompilovaly, nebo vymažte datový typ, x:Data={x:Null}} pokud by se vazba neměla zkompilovat. Ve výchozím nastavení je tato vlastnost sestavení nastavena, pokud true je povolené úplné oříznutí nebo nativní AOT. |
MauiHybridWebViewSupported |
Pokud je tato možnost nastavená false , HybridWebView ovládací prvek nebude k dispozici. Ve výchozím nastavení je tato vlastnost sestavení nastavena, pokud false je povolené úplné oříznutí nebo nativní AOT. |
Tyto vlastnosti nástroje MSBuild mají také ekvivalentní AppContext přepínače:
- Vlastnost
MauiEnableVisualAssemblyScanning
MSBuild má ekvivalentní AppContext přepínač s názvemMicrosoft.Maui.RuntimeFeature.IsIVisualAssemblyScanningEnabled
. - Vlastnost
MauiShellSearchResultsRendererDisplayMemberNameSupported
MSBuild má ekvivalentní AppContext přepínač s názvemMicrosoft.Maui.RuntimeFeature.IsShellSearchResultsRendererDisplayMemberNameSupported
. - Vlastnost
MauiQueryPropertyAttributeSupport
MSBuild má ekvivalentní AppContext přepínač s názvemMicrosoft.Maui.RuntimeFeature.IsQueryPropertyAttributeSupported
. - Vlastnost
MauiImplicitCastOperatorsUsageViaReflectionSupport
MSBuild má ekvivalentní AppContext přepínač s názvemMicrosoft.Maui.RuntimeFeature.IsImplicitCastOperatorsUsageViaReflectionSupported
. - Vlastnost
_MauiBindingInterceptorsSupport
MSBuild má ekvivalentní AppContext přepínač s názvemMicrosoft.Maui.RuntimeFeature.AreBindingInterceptorsSupported
. - Vlastnost
MauiEnableXamlCBindingWithSourceCompilation
MSBuild má ekvivalentní AppContext přepínač s názvemMicrosoft.Maui.RuntimeFeature.MauiEnableXamlCBindingWithSourceCompilationEnabled
. - Vlastnost
MauiHybridWebViewSupported
MSBuild má ekvivalentní AppContext přepínač s názvemMicrosoft.Maui.RuntimeFeature.IsHybridWebViewSupported
.
Nejjednodušší způsob, jak použít přepínač funkcí, je vložením odpovídající vlastnosti MSBuild do souboru projektu vaší aplikace (*.csproj), který způsobí oříznutí souvisejícího kódu ze sestavení .NET MAUI.
Nasazení aplikací pro Windows
Při ladění a nasazení nového projektu .NET MAUI do Windows je výchozím chováním v .NET MAUI 9 nasazení rozbalené aplikace. Další informace najdete v tématu Nasazení a ladění aplikace .NET MAUI ve Windows.
Kódy chyb kompilátoru XAML
V rozhraní .NET MAUI 9 se kódy chyb kompilátoru XAML změnily na XFC
XC
. Ujistěte se, že aktualizujete $(WarningsAsErrors)
vlastnosti , $(WarningsNotAsErrors)
a $(NoWarn)
sestavíte vlastnosti v souborech projektu vaší aplikace, pokud se používá, aby odkazy na novou předponu.
Rozšíření značek XAML
Všechny třídy, které implementují IMarkupExtension, IMarkupExtension<T>IValueProvidera IExtendedTypeConverter musí být opatřeny poznámkami buď pomocí RequireServiceAttribute nebo AcceptEmptyServiceProviderAttribute. To se vyžaduje kvůli optimalizaci kompilátoru XAML zavedené v rozhraní .NET MAUI 9, která umožňuje generování efektivnějšího kódu, což pomáhá snížit velikost aplikace a zlepšit výkon modulu runtime.
Informace o přidávání poznámek k rozšířením značek pomocí těchto atributů naleznete v tématu Poskytovatelé služeb.
Synchronizace Xcode
.NET MAUI 9 zahrnuje synchronizaci Xcode (xcsync
), což je nástroj, který umožňuje používat Xcode ke správě konkrétních souborů Apple s projekty .NET, včetně katalogů prostředků, souborů plist, scénářů a souborů xib. Nástroj má dva hlavní příkazy pro vygenerování dočasného projektu Xcode z projektu .NET a synchronizaci změn ze souborů Xcode zpět do projektu .NET.
Tyto soubory můžete vygenerovat nebo synchronizovat pomocí dotnet build
xcsync-generate
xcsync-sync
příkazů a předat soubor projektu a další argumenty:
dotnet build /t:xcsync-generate
/p:xcSyncProjectFile=<PROJECT>
/p:xcSyncXcodeFolder=<TARGET_XCODE_DIRECTORY>
/p:xcSyncTargetFrameworkMoniker=<FRAMEWORK>
/p:xcSyncVerbosity=<LEVEL>
Další informace najdete v tématu Synchronizace Xcode.
Zastaralá rozhraní API
.NET MAUI 9 vyřadí některá rozhraní API, která se v budoucí verzi úplně odeberou.
Rámec
Ovládací Frame prvek je v .NET MAUI 9 označený jako zastaralý a v budoucí verzi se úplně odebere. Ovládací Border prvek by měl být použit na svém místě.
Při nahrazení FrameBorderby se hodnota vlastnosti Frame.BorderColor měla stát hodnotou vlastnosti Border.Stroke a hodnota vlastnosti Frame.CornerRadius by měla být součástí hodnoty vlastnosti Border.StrokeShape. Kromě toho může být nutné duplikovat Margin
hodnotu jako hodnotu Padding
.
Následující příklad ukazuje ekvivalentní Frame a Border elementy v XAML:
<Frame BorderColor="DarkGray"
CornerRadius="5"
Margin="20"
HeightRequest="360"
HorizontalOptions="Center"
VerticalOptions="Center" />
<Border Stroke="DarkGray"
StrokeShape="RoundRectangle 5"
Margin="20"
Padding="20"
HeightRequest="360"
HorizontalOptions="Center"
VerticalOptions="Center" />
Další informace naleznete v tématu Ohraničení.
MainPage
Místo definování první stránky aplikace pomocí MainPage vlastnosti objektu Application byste měli Page nastavit vlastnost na Window první stránce aplikace. To se stane interně v rozhraní .NET MAUI při nastavování MainPage vlastnosti, takže neexistuje žádná změna chování zavedená MainPage vlastností, která je označena jako zastaralá.
Následující příklad ukazuje nastavení Page vlastnosti na , Windowprostřednictvím přepsání CreateWindow
:
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState? activationState)
{
return new Window(new AppShell());
}
}
Kód, který přistupuje k Application.Current.MainPage
vlastnosti, by teď měl přistupovat k Application.Current.Windows[0].Page
vlastnosti pro aplikace s jedním oknem. U aplikací s více okny použijte Application.Current.Windows
kolekci k identifikaci správného okna a přístup k Page
vlastnosti. Každý prvek navíc obsahuje Window
vlastnost, která je přístupná, když je prvek součástí aktuálního okna, ze kterého Page
je vlastnost přístupná (Window.Page
). Kód platformy může načíst objekt aplikace IWindow pomocí Microsoft.Maui.Platform.GetWindow
metody rozšíření.
Zatímco je MainPage vlastnost zachována v .NET MAUI 9, bude zcela odebrána v budoucí verzi.
Rozložení kompatibility
Třídy rozložení kompatibility v Microsoft.Maui.Controls.Compatibility oboru názvů byly zastaralé.
Volání starších měr
VisualElement Následující metody míry byly zastaralé:
Jedná se o metody starších měr, které nefungují správně s očekáváním rozložení .NET MAUI.
Jako náhradu VisualElement.Measure(Double, Double) byla metoda zavedena. Tato metoda vrátí minimální velikost, kterou prvek potřebuje k zobrazení na zařízení. Okraje jsou z měření vyloučené, ale vrátí se s velikostí. Toto je upřednostňovaná metoda volání při měření zobrazení.
Kromě toho SizeRequest je struktura zastaralá. Size Místo toho byste měli použít.
Upgrade z .NET 8 na .NET 9
Pokud chcete upgradovat projekty .NET MAUI z .NET 8 na .NET 9, nejprve nainstalujte .NET 9 a úlohu .NET MAUI pomocí sady Visual Studio 17.12 nebo pomocí editoru Visual Studio Code a rozšíření .NET MAUI a .NET a úloh .NET MAUI nebo pomocí samostatného dotnet workload install maui
a příkazu.
Aktualizace souboru projektu
Pokud chcete aktualizovat aplikaci .NET MAUI z .NET 8 na .NET 9, otevřete soubor projektu aplikace (.csproj) a změňte monikers cílové architektury (TFM) z 8 na 9. Pokud používáte TFM, jako net8.0-ios15.2
je třeba, že odpovídá verzi platformy, nebo ji úplně odeberete. Následující příklad ukazuje TFM pro projekt .NET 8:
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst;net8.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
Následující příklad ukazuje TFM pro projekt .NET 9:
<TargetFrameworks>net9.0-android;net9.0-ios;net9.0-maccatalyst;net9.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net9.0-windows10.0.19041.0</TargetFrameworks>
Pokud soubor projektu vaší aplikace odkazuje na verzi Microsoft.Maui.Controls
balíčku NuGet .NET 8, a to buď přímo, nebo prostřednictvím $(MauiVersion)
vlastnosti sestavení, aktualizujte ji na verzi .NET 9. Pak odeberte odkaz na balíček NuGet za předpokladu Microsoft.Maui.Controls.Compatibility
, že vaše aplikace nepoužívá žádné typy z tohoto balíčku. Kromě toho aktualizujte odkaz Microsoft.Extensions.Logging.Debug
na balíček NuGet na nejnovější verzi .NET 9.
Pokud vaše aplikace cílí na iOS nebo Mac Catalyst, aktualizujte $(SupportedOSPlatformVersion)
vlastnosti sestavení pro tyto platformy na 15.0:
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">15.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">15.0</SupportedOSPlatformVersion>
Při ladění a nasazení nového projektu .NET MAUI do Windows je výchozím chováním v .NET 9 nasazení rozbalené aplikace. Pokud chcete toto chování přijmout, přečtěte si téma Převod zabalené aplikace .NET MAUI pro Windows na rozbalení.
Před prvním sestavením upgradované aplikace odstraňte bin
složky a obj
složky. Všechny chyby a upozornění sestavení vás provedou dalšími kroky.
Aktualizace kódů chyb kompilátoru XAML
Kódy chyb kompilátoru XAML změnily jejich předponu na XFC
XC
, takže aktualizujte $(WarningsAsErrors)
$(WarningsNotAsErrors)
vlastnosti a $(NoWarn)
vlastnosti sestavení v souboru projektu vaší aplikace, pokud se používá, aby odkazovaly na novou předponu.
Řešení nových upozornění kompilátoru XAML pro kompilované vazby
Upozornění sestavení budou vytvořena pro vazby, které nepoužívají kompilované vazby, a je potřeba je vyřešit. Další informace najdete v upozorněních kompilovaných vazeb XAML.
Aktualizace rozšíření značek XAML
Rozšíření značek XAML musí být opatřena poznámkami buď s příponou RequireServiceAttribute NEBO AcceptEmptyServiceProviderAttribute. To se vyžaduje kvůli optimalizaci kompilátoru XAML, která umožňuje generování efektivnějšího kódu, což pomáhá snížit velikost aplikace a zlepšit výkon modulu runtime. Další informace najdete v tématu Poskytovatelé služeb.
Zastaralá rozhraní API pro adresy
.NET MAUI 9 vyřadí některá rozhraní API, která se v budoucí verzi úplně odeberou. Proto vyřešte všechna upozornění sestavení týkající se zastaralých rozhraní API. Další informace najdete v tématu Zastaralá rozhraní API.
Přijetí zkompilovaných vazeb, které nastavují vlastnost Source
Můžete se rozhodnout pro kompilaci vazeb, které tuto vlastnost nastavují Source
, a využít tak lepší výkon modulu runtime. Další informace naleznete v tématu Kompilace vazeb, které definují Source
vlastnost.
Přijetí zkompilovaných vazeb v jazyce C#
Můžete se rozhodnout, že kompilujete vazbové výrazy deklarované v kódu, abyste mohli využívat lepší výkon modulu runtime. Další informace naleznete v tématu Kompilované vazby v kódu.
Přijetí úplného oříznutí
Pokud chcete snížit celkovou velikost aplikace nastavením $(TrimMode)
vlastnosti MSBuild na full
hodnotu , můžete použít úplné ořezávání, abyste snížili celkovou velikost aplikace. Další informace najdete v tématu Oříznutí aplikace .NET MAUI.
Přijetí nasazení NativeAOT na podporovaných platformách
Můžete se rozhodnout pro nativní nasazení AOT v systémech iOS a Mac Catalyst. Nativní nasazení AOT vytvoří aplikaci .NET MAUI, která byla předem zkompilována do nativního kódu. Další informace najdete v tématu Nativní nasazení AOT v systémech iOS a Mac Catalyst.
.NET pro Android
.NET pro Android v .NET 9, která přidává podporu rozhraní API 35, zahrnuje práci na zkrácení doby sestavování a zlepšení možností oříznutí aplikací za účelem snížení velikosti a zlepšení výkonu. Další informace o .NET pro Android v .NET 9 najdete v následujících poznámkách k verzi:
- .NET pro Android 9
- .NET pro Android 9 RC2
- .NET pro Android 9 RC1
- .NET pro Android 9 Preview 7
- .NET pro Android 9 Preview 6
- .NET pro Android 9 Preview 5
- .NET pro Android 9 Preview 4
- .NET pro Android 9 Preview 3
- .NET pro Android 9 Preview 2
- .NET pro Android 9 Preview 1
Balíčky prostředků
.NET pro Android v .NET 9 zavádí možnost umístit prostředky do samostatného balíčku, označovaného jako balíček assetů. Díky tomu můžete nahrávat hry a aplikace, které by normálně byly větší než základní velikost balíčku povolená službou Google Play. Když tyto prostředky vložíte do samostatného balíčku, získáte možnost nahrát balíček, který je o velikosti až 2 GB, a ne do základní velikosti balíčku 200 Mb.
Důležité
Balíčky prostředků můžou obsahovat pouze prostředky. V případě .NET pro Android to znamená položky, které mají AndroidAsset
akci sestavení.
Aplikace .NET MAUI definují prostředky prostřednictvím MauiAsset
akce sestavení. Balíček prostředků lze zadat prostřednictvím atributu AssetPack
:
<MauiAsset
Include="Resources\Raw\**"
LogicalName="%(RecursiveDir)%(Filename)%(Extension)"
AssetPack="myassetpack" />
Poznámka:
Další metadata budou ignorována jinými platformami.
Pokud máte konkrétní položky, které chcete umístit do balíčku assetů, můžete pomocí Update
atributu AssetPack
definovat metadata:
<MauiAsset Update="Resources\Raw\MyLargeAsset.txt" AssetPack="myassetpack" />
Balíčky prostředků můžou mít různé možnosti doručení, které řídí, kdy se vaše prostředky nainstalují do zařízení:
- Instalují se časové sady současně s aplikací. Tento typ balíčku může mít velikost až 1 Gb, ale můžete je mít pouze jeden z nich. Tento typ doručení je určen metadaty
InstallTime
. - Rychlé následné balíčky se v určitém okamžiku nainstalují krátce po dokončení instalace aplikace. Aplikace se bude moct spustit, když je tento typ balíčku nainstalovaný, takže byste měli zkontrolovat, jestli se instalace dokončila, než se pokusíte použít prostředky. Tento druh balíčku prostředků může mít velikost až 512 MB. Tento typ doručení je určen metadaty
FastFollow
. - Balíčky na vyžádání se do zařízení nikdy nestáhnou, pokud ji aplikace výslovně nepožádá. Celková velikost všech balíčků prostředků nesmí překročit 2 Gb a můžete mít až 50 samostatných balíčků prostředků. Tento typ doručení je určen metadaty
OnDemand
.
V aplikacích .NET MAUI lze typ doručení zadat pomocí atributu DeliveryType
na:MauiAsset
<MauiAsset Update="Resources\Raw\myvideo.mp4" AssetPack="myassetpack" DeliveryType="FastFollow" />
Další informace o sadách assetů Androidu najdete v tématu Sady Asset Pack pro Android.
Podpora Androidu 15
.NET pro Android v .NET 9 přidává vazby .NET pro Android 15 (API 35). Pokud chcete vytvořit pro tato rozhraní API, aktualizujte cílovou architekturu projektu na net9.0-android
:
<TargetFramework>net9.0-android</TargetFramework>
Poznámka:
Můžete také zadat net9.0-android35
jako cílovou architekturu, ale číslo 35 se pravděpodobně změní v budoucích verzích .NET tak, aby odpovídaly novějším verzím operačního systému Android.
Ve výchozím nastavení jsou 64bitové architektury
.NET pro Android v .NET 9 už ve výchozím nastavení nevytvoří následující identifikátory modulu runtime (RID):
android-arm
android-x86
Tím by se měla zkrátit doba sestavení a zmenšit velikost souborů Androidu .apk
. Upozorňujeme, že Google Play podporuje rozdělení sad aplikací na architekturu.
Pokud potřebujete vytvořit pro tyto architektury, můžete je přidat do souboru projektu (.csproj):
<RuntimeIdentifiers>android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>
Nebo v projektu s více cíli:
<RuntimeIdentifiers Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>
Metody zařazování androidu
Vylepšení metod zařazování androidu v .NET 9 zpřístupnilo funkci spolehlivěji v aplikacích, ale zatím není výchozí. Povolení této funkce vedlo ke zvýšení výkonu v testovací aplikaci o přibližně 10 %.
Metody zařazování pro Android lze v souboru projektu (.csproj) povolit prostřednictvím $(AndroidEnableMarshalMethods)
vlastnosti:
<PropertyGroup>
<AndroidEnableMarshalMethods>true</AndroidEnableMarshalMethods>
</PropertyGroup>
Konkrétní podrobnosti o této funkci najdete v dokumentaci k funkcím nebo implementaci na GitHubu.
Vylepšení oříznutí
V .NET 9 jsou teď sestavení rozhraní ANDROID API (Mono.Android.dll, Java.Interop.dll) plně kompatibilní. Pokud se chcete přihlásit k úplnému oříznutí, nastavte $(TrimMode)
vlastnost v souboru projektu (.csproj):
<PropertyGroup>
<TrimMode>Full</TrimMode>
</PropertyGroup>
To také umožňuje analyzátory oříznutí, aby se upozornění zavedla pro jakýkoli problematický kód jazyka C#.
Další informace najdete v tématu Oříznutí členitosti.
.NET pro iOS
.NET 9 v systémech iOS, tvOS, Mac Catalyst a macOS používá Xcode 16.0 pro následující verze platformy:
- iOS: 18.0
- tvOS: 18.0
- Mac Catalyst: 18.0
- macOS: 15.0
Další informace o .NET 9 v systémech iOS, tvOS, Mac Catalyst a macOS najdete v následujících poznámkách k verzi:
- .NET 9
- .NET 9.0.1xx RC2
- .NET 9.0.1xx RC1
- .NET 9.0.1xx Preview 7
- .NET 9.0.1xx Preview 6
- .NET 9.0.1xx Preview 5
- .NET 9.0.1xx Preview 4
- .NET 9.0.1xx Preview 3
- .NET 9.0.1xx Preview 2
- .NET 9.0.1xx Preview 1
Vazby
.NET pro iOS 9 zavádí možnost více cílových verzí .NET pro vazby iOS. Projekt knihovny může být například potřeba sestavit pro dvě odlišné verze iOS:
<TargetFrameworks>net9.0-ios17.0;net9.0-ios17.2</TargetFrameworks>
Tím se vytvoří dvě knihovny, jedna pomocí vazeb iOS 17.0 a jedna pomocí vazeb iOS 17.2.
Důležité
Projekt aplikace by měl vždy cílit na nejnovější sadu SDK pro iOS.
Vylepšení oříznutí
V .NET 9 jsou teď sestavení iOS a Mac Catalyst (Microsoft.iOS.dll, Microsoft.MacCatalyst.dll atd.) plně kompatibilní. Pokud se chcete přihlásit k úplnému oříznutí, nastavte $(TrimMode)
vlastnost v souboru projektu (.csproj):
<PropertyGroup>
<TrimMode>Full</TrimMode>
</PropertyGroup>
To také umožňuje analyzátory oříznutí, aby se upozornění zavedla pro jakýkoli problematický kód jazyka C#.
Další informace najdete v tématu Oříznutí členitosti.
Nativní AOT pro iOS a Mac Catalyst
V .NET pro iOS 9 využívá nativní kompilace AOT (Head of Time) pro iOS a Mac Catalyst úplné oříznutí, aby se snížila velikost balíčku a výkon při spuštění vaší aplikace. NativeAOT vychází z úplného oříznutí, a to tím, že se také přihlásí k novému modulu runtime.
Důležité
Aby bylo možné tuto funkci využít, musí být vaše aplikace a její závislosti plně ořízitelné.
NativeAOT vyžaduje, aby aplikace byly vytvořeny s upozorněními nulového zatřižení, aby aplikace fungovala správně za běhu.