Sdílet prostřednictvím


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:

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í:

Přehled záhlaví .NET MAUI

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="&#xE713;"
                                 FontFamily="SegoeMDL2"/>
            </ImageButton.Source>
        </ImageButton>
    </TitleBar.TrailingContent>
</TitleBar>

Následující snímek obrazovky ukazuje výsledný vzhled:

Snímek obrazovky záhlaví .NET MAUI

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 CreateMauiAppMauiProgram.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 CollectionViewCarouselView. 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, Datea 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 Funcvrá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í AddSingletonAddTransient, 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í hodnota HandlerProperties.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 :

Snímek obrazovky znázorňuje, jak přidat ukázkové stránky SyncFusion do projektu aplikace .NET MAUI.

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 fullhodnotu . 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í:

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 falsehodnotu , [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 falsehodnotu .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á, falsenebude 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ázvem Microsoft.Maui.RuntimeFeature.IsIVisualAssemblyScanningEnabled.
  • Vlastnost MauiShellSearchResultsRendererDisplayMemberNameSupported MSBuild má ekvivalentní AppContext přepínač s názvem Microsoft.Maui.RuntimeFeature.IsShellSearchResultsRendererDisplayMemberNameSupported.
  • Vlastnost MauiQueryPropertyAttributeSupport MSBuild má ekvivalentní AppContext přepínač s názvem Microsoft.Maui.RuntimeFeature.IsQueryPropertyAttributeSupported.
  • Vlastnost MauiImplicitCastOperatorsUsageViaReflectionSupport MSBuild má ekvivalentní AppContext přepínač s názvem Microsoft.Maui.RuntimeFeature.IsImplicitCastOperatorsUsageViaReflectionSupported.
  • Vlastnost _MauiBindingInterceptorsSupport MSBuild má ekvivalentní AppContext přepínač s názvem Microsoft.Maui.RuntimeFeature.AreBindingInterceptorsSupported.
  • Vlastnost MauiEnableXamlCBindingWithSourceCompilation MSBuild má ekvivalentní AppContext přepínač s názvem Microsoft.Maui.RuntimeFeature.MauiEnableXamlCBindingWithSourceCompilationEnabled.
  • Vlastnost MauiHybridWebViewSupported MSBuild má ekvivalentní AppContext přepínač s názvem Microsoft.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 XFCXC. 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 buildxcsync-generatexcsync-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 XFCXC, 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 fullhodnotu , 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:

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:

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.

Viz také