Udostępnij za pośrednictwem


Co nowego w programie .NET MAUI dla platformy .NET 9

Celem interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) na platformie .NET 9 jest zwiększenie jakości produktu. Obejmuje to rozszerzanie zakresu testów, kompleksowe testowanie scenariuszy i naprawianie usterek. Aby uzyskać więcej informacji na temat ulepszeń jakości produktu w programie .NET MAUI 9, zobacz następujące informacje o wersji:

Ważne

Ze względu na pracę z zależnościami zewnętrznymi, takimi jak narzędzia Xcode lub Android SDK, zasady obsługi programu .NET MAUI różnią się od zasad obsługi platformy .NET i platformy .NET Core. Aby uzyskać więcej informacji, zobacz Zasady obsługi programu .NET MAUI.

Podczas kompilowania przy użyciu programu .NET MAUI 9 wymagana jest zgodność z programem Xcode 16, który obejmuje obsługę zestawu SDK dla systemów iOS 18, iPadOS 18, tvOS 18 i macOS 15. Program Xcode 16 wymaga komputera Mac z systemem macOS 14.5 lub nowszym.

Na platformie .NET 9 program .NET MAUI jest dostarczany jako obciążenie platformy .NET i wiele pakietów NuGet. Zaletą tego podejścia jest możliwość łatwego przypinania projektów do określonych wersji, a także umożliwia łatwe wyświetlanie podglądu nieopublikowanych lub eksperymentalnych kompilacji. Podczas tworzenia nowego projektu .NET MAUI wymagane pakiety NuGet są automatycznie dodawane do projektu.

Minimalne cele wdrożenia

Program .NET MAUI 9 wymaga minimalnych celów wdrażania systemów iOS 12.2 i Mac Catalyst 15.0 (macOS 12.0). Minimalne cele wdrażania systemów Android i Windows pozostają takie same. Aby uzyskać więcej informacji, zobacz Obsługiwane platformy dla aplikacji .NET MAUI.

Nowe kontrolki

Program .NET MAUI 9 zawiera dwa nowe kontrolki.

HybridWebView

HybridWebView umożliwia hostowanie dowolnej zawartości HTML/JS/CSS w widoku internetowym i umożliwia komunikację między kodem w widoku internetowym (JavaScript) i kodem hostujący widok internetowy (C#/.NET). Jeśli na przykład masz istniejącą aplikację React JS, możesz ją hostować w wieloplatformowej aplikacji natywnej .NET MAUI i skompilować zaplecze aplikacji przy użyciu języków C# i .NET.

Aby utworzyć aplikację HybridWebView MAUI platformy .NET, potrzebujesz:

  • Zawartość internetowa aplikacji, która składa się ze statycznych plików HTML, JavaScript, CSS, obrazów i innych plików.
  • Kontrolka HybridWebView w ramach interfejsu użytkownika aplikacji. Można to osiągnąć, odwołując się do niego w języku XAML aplikacji.
  • Kod w zawartości internetowej i w języku C#/.NET, który używa HybridWebView interfejsów API do wysyłania komunikatów między dwoma składnikami.

Cała aplikacja, w tym zawartość internetowa, jest pakowana i uruchamiana lokalnie na urządzeniu i może zostać opublikowana w odpowiednich sklepach z aplikacjami. Zawartość internetowa jest hostowana w natywnej kontrolce widoku sieci Web i jest uruchamiana w kontekście aplikacji. Każda część aplikacji może uzyskiwać dostęp do zewnętrznych usług internetowych, ale nie jest wymagana.

Aby uzyskać więcej informacji, zobacz HybridWebView.

Pasek tytułu dla systemu Windows

Kontrolka TitleBar umożliwia dodawanie niestandardowego paska tytułu do aplikacji w systemie Windows:

Omówienie paska tytułu programu .NET MAUI.

Wartość TitleBar właściwości można ustawić jako dowolną Window.TitleBar TitleBarwartość :

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

Przykładem jego użycia w języku C# jest:

Window window = new Window
{
    TitleBar = new TitleBar
    {
        Icon = "titlebar_icon.png"
        Title = "My App",
        Subtitle = "Demo"
        Content = new SearchBar { ... }      
    }
};

Element A TitleBar jest wysoce dostosowywalny za pomocą właściwości Content, LeadingContenti TrailingContent :

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

Poniższy zrzut ekranu przedstawia wynikowy wygląd:

Zrzut ekranu paska tytułu programu .NET MAUI.

Uwaga

Obsługa programu Mac Catalyst dla kontrolki TitleBar zostanie dodana w przyszłej wersji.

Aby uzyskać więcej informacji, zobacz TytułBar.

Ulepszenia kontroli

Program .NET MAUI 9 zawiera ulepszenia sterowania.

Tryb powiązania BackButtonBehavior OneWay

Tryb powiązania dla IsVisible elementu i IsEnabled w BackButtonBehavior aplikacji powłoki jest teraz BindingMode.OneWay zamiast BindingMode.OneTime. Dzięki temu można łatwiej kontrolować zachowanie przycisku Wstecz w czasie wykonywania przy użyciu powiązań danych:

<ContentPage ...>    
    <Shell.BackButtonBehavior>
        <BackButtonBehavior Command="{Binding BackCommand}"
                            IsVisible="{Binding IsBackButtonVisible}"
                            IconOverride="back.png" />   
    </Shell.BackButtonBehavior>
    ...
</ContentPage>

BlazorWebView

W systemach iOS i Mac Catalyst 18 program .NET MAUI 9 zmienia domyślne zachowanie hostowania zawartości na BlazorWebView wartość localhost. Adres wewnętrzny 0.0.0.1 używany do hostowania zawartości nie działa i powoduje BlazorWebView , że nie ładuje żadnej zawartości i renderowania jako pusty prostokąt.

Aby wyrazić zgodę na 0.0.0.1 korzystanie z adresu, dodaj następujący kod do CreateMauiApp metody w MauiProgram.cs:

// Set this switch to use the LEGACY behavior of always using 0.0.0.1 to host BlazorWebView
AppContext.SetSwitch("BlazorWebView.AppHostAddressAlways0000", true);

Jeśli napotkasz zawieszenie w systemie Android, BlazorWebView należy włączyć AppContext przełącznik w metodzie CreateMauiApp w MauiProgram klasie:

AppContext.SetSwitch("BlazorWebView.AndroidFireAndForgetAsync", true);

Ten przełącznik umożliwia BlazorWebView uruchomienie i zapomnienie asynchronicznego usuwania, które występuje, a w rezultacie naprawia większość zakleszczeń usuwania występujących w systemie Android. Aby uzyskać więcej informacji, zobacz Naprawianie zakleszczenia usuwania w systemie Android.

Przyciski w systemie iOS

Button kontrolki w systemie iOS teraz szanują odstępy, dopełnienie, szerokość obramowania i marginesy dokładniej niż w poprzednich wersjach. Duży obraz w obiekcie Button zostanie teraz zmieniony na maksymalny rozmiar, uwzględniając odstępy, dopełnienie, szerokość obramowania i marginesy. Button Jeśli jednak element zawiera tekst i obraz, może nie być możliwe dopasowanie całej zawartości wewnątrz przycisku, dlatego należy ręcznie rozmiar obrazu w celu osiągnięcia żądanego układu.

CollectionView i CarouselView

Program .NET MAUI 9 zawiera dwa opcjonalne nowe programy obsługi w systemach iOS i Mac Catalyst, które zapewniają poprawę wydajności i stabilności w systemach CollectionView i CarouselView. Te programy obsługi są oparte na UICollectionView interfejsach API.

Aby wyrazić zgodę na korzystanie z tych procedur obsługi, dodaj następujący kod do MauiProgram klasy:

#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

W programie .NET MAUI 9 HideSoftInputOnTapped właściwość jest również obsługiwana na komputerach Mac Catalyst, a także w systemach Android i iOS.

Obsługa wprowadzania klawiatury miękkiej

Program .NET MAUI 9 dodaje nową obsługę wprowadzania klawiatury miękkiej dla elementów Password, Datei Time. Można je włączyć i Editor Entry kontrolki:

<Entry Keyboard="Date" />

Wyrównanie tekstu

Wyliczenie TextAlignment dodaje element członkowski Justify , który może służyć do wyrównywania tekstu w kontrolkach tekstu. Na przykład można wyrównać tekst w poziomie do Label elementu za pomocą polecenia HorizontalTextAlignment.Justify:

<Label Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. In facilisis nulla eu felis fringilla vulputate."
       HorizontalTextAlignment="Justify"/>

TimePicker

TimePickerTimeSelected zyskuje zdarzenie, które jest zgłaszane, gdy wybrany czas się zmienia. Obiekt TimeChangedEventArgs , który towarzyszy TimeSelected zdarzeniu, ma NewTime właściwości i OldTime , które określają odpowiednio nowy i stary czas.

WebView

WebView dodaje zdarzenie ProcessTerminated , które jest zgłaszane, gdy WebView proces kończy się nieoczekiwanie. Obiekt WebViewProcessTerminatedEventArgs , który towarzyszy temu zdarzeniu, definiuje właściwości specyficzne dla platformy, które wskazują, dlaczego proces zakończył się niepowodzeniem.

Skompilowane powiązania w kodzie

Powiązania napisane w kodzie zwykle używają ścieżek ciągów rozpoznawanych w czasie wykonywania z odbiciem, a obciążenie związane z wykonywaniem tej czynności różni się od platformy do platformy. Program .NET MAUI 9 wprowadza dodatkową SetBinding metodę rozszerzenia, która definiuje powiązania przy użyciu Func argumentu zamiast ścieżki ciągu:

// in .NET 8
MyLabel.SetBinding(Label.TextProperty, "Text");

// in .NET 9
MyLabel.SetBinding(Label.TextProperty, static (Entry entry) => entry.Text);

To skompilowane podejście do powiązania zapewnia następujące korzyści:

  • Zwiększona wydajność powiązania danych przez rozpoznawanie wyrażeń powiązań w czasie kompilacji, a nie w czasie wykonywania.
  • Lepsze środowisko rozwiązywania problemów dla deweloperów, ponieważ nieprawidłowe powiązania są zgłaszane jako błędy kompilacji.
  • Funkcja IntelliSense podczas edytowania.

Nie wszystkie metody mogą służyć do definiowania skompilowanego powiązania. Wyrażenie musi być prostym wyrażeniem dostępu do właściwości. W poniższych przykładach pokazano prawidłowe i nieprawidłowe wyrażenia powiązania:

// 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}";

Ponadto program .NET MAUI 9 dodaje metodę Binding.Create , która ustawia powiązanie bezpośrednio na obiekcie za pomocą Funcklasy , i zwraca wystąpienie obiektu powiązania:

// 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()
});

Ważne

Skompilowane powiązania są wymagane zamiast powiązań opartych na ciągach w aplikacjach NativeAOT i w aplikacjach z włączonym pełnym przycinaniem.

Skompilowane powiązania w języku XAML

W programie .NET MAUI 8 skompilowane powiązania są wyłączone dla wszystkich wyrażeń powiązań XAML definiujących Source właściwość i nie są obsługiwane w przypadku powiązań wielowiążków. Te ograniczenia zostały usunięte w programie .NET MAUI 9. Aby uzyskać informacje na temat kompilowania wyrażeń powiązań XAML definiujących Source właściwość, zobacz Kompilowanie powiązań definiujących Source właściwość.

Domyślnie program .NET MAUI 9 generuje ostrzeżenia kompilacji dla powiązań, które nie używają skompilowanych powiązań. Aby uzyskać więcej informacji na temat ostrzeżeń dotyczących powiązań skompilowanych XAML, zobacz ostrzeżenia dotyczące skompilowanych powiązań XAML.

Rozłączanie programu obsługi

Podczas implementowania niestandardowej kontrolki przy użyciu procedur obsługi każda implementacja programu obsługi platformy jest wymagana do zaimplementowania DisconnectHandler() metody , aby wykonać dowolne czyszczenie widoku natywnego, takie jak anulowanie subskrypcji zdarzeń. Jednak przed programem .NET MAUI 9 implementacja DisconnectHandler() celowo nie jest wywoływana przez program .NET MAUI. Zamiast tego należy wywołać ją samodzielnie podczas wybierania czyszczenia kontrolki, na przykład podczas przechodzenia do tyłu w aplikacji.

W programie .NET MAUI 9 programy obsługi automatycznie odłączają się od swoich kontrolek, jeśli to możliwe, na przykład podczas przechodzenia do tyłu w aplikacji. W niektórych scenariuszach możesz nie chcieć tego zachowania. W związku z tym program .NET MAUI 9 dodaje dołączoną HandlerProperties.DisconnectPolicy właściwość do kontrolowania, gdy programy obsługi są odłączone od kontrolek. Ta właściwość wymaga argumentu z wyliczeniem HandlerDisconnectPolicy definiującym następujące wartości:

  • Automatic, co wskazuje, że programy obsługi zostaną automatycznie odłączone. Jest to wartość domyślna dołączonej HandlerProperties.DisconnectPolicy właściwości.
  • Manual, co wskazuje, że programy obsługi muszą zostać rozłączone ręcznie przez wywołanie implementacji DisconnectHandler() .

W poniższym przykładzie pokazano ustawienie dołączonej HandlerProperties.DisconnectPolicy właściwości:

<controls:Video x:Name="video"
                HandlerProperties.DisconnectPolicy="Manual"
                Source="video.mp4"
                AutoPlay="False" />

Równoważny kod języka C# to:

Video video = new Video
{
    Source = "video.mp4",
    AutoPlay = false
};
HandlerProperties.SetDisconnectPolicy(video, HandlerDisconnectPolicy.Manual);

Ponadto istnieje DisconnectHandlers metoda rozszerzenia, która rozłącza programy obsługi z danego IViewelementu :

video.DisconnectHandlers();

Podczas odłączania DisconnectHandlers metoda będzie propagowana w dół drzewa kontrolek do momentu zakończenia lub odebrania kontrolki, która ustawiła zasady ręczne.

Obsługa wielu okien

Program .NET MAUI 9 dodaje możliwość przeniesienia określonego okna z przodu na katalizatory mac i windows za pomocą Application.Current.ActivateWindow metody :

Application.Current?.ActivateWindow(windowToActivate);

Wdrożenie natywnej usługi AOT

W programie .NET MAUI 9 możesz zdecydować się na wdrożenie natywnego AOT w systemach iOS i Mac Catalyst. Natywne wdrożenie AOT tworzy aplikację .NET MAUI, która została skompilowana przed czasem (AOT) do kodu natywnego. Daje to następujące korzyści:

  • Zmniejszony rozmiar pakietu aplikacji, zazwyczaj do 2,5 razy mniejszy.
  • Krótszy czas uruchamiania, zazwyczaj do 2 razy szybszy.
  • Krótszy czas kompilacji.

Aby uzyskać więcej informacji, zobacz Natywne wdrażanie AOT w systemach iOS i Mac Catalyst.

Osadzanie natywne

Program .NET MAUI 9 zawiera pełne interfejsy API dla natywnych scenariuszy osadzania, które wcześniej musiały zostać ręcznie dodane do projektu:

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);

Alternatywnie możesz użyć ToPlatformEmbedded metody , przekazując Window element dla platformy, na której działa aplikacja:

var mauiApp = MauiProgram.CreateMauiApp();
var mauiView = new MyMauiContent();
var nativeView = mauiView.ToPlatformEmbedded(mauiApp, window);

W obu przykładach nativeView jest to wersja specyficzna dla platformy .mauiView

Aby uruchomić natywną aplikację osadzoną na platformie .NET MAUI 9, wywołaj metodę UseMauiEmbeddedApp rozszerzenia w MauiAppBuilder obiekcie:

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();

        builder
            .UseMauiEmbeddedApp<App>();

        return builder.Build();
    }
}

Aby uzyskać więcej informacji, zobacz Osadzanie natywne.

Szablony projektu

Program .NET MAUI 9 dodaje szablon projektu .NET MAUI Blazor Hybrid and Web App do programu Visual Studio, który tworzy rozwiązanie z aplikacją hybrydową platformy .NET MAUI Blazor z aplikacją internetową Blazor, która współużytkuje wspólny kod w projekcie biblioteki klas Razor.

Szablon można również użyć z pliku dotnew new:

dotnet new maui-blazor-web -n AllTheTargets

Słowniki zasobów

W programie .NET MAUI 9 autonomiczny kod XAML ResourceDictionary (który nie jest wspierany przez plik z kodem) domyślnie ma skompilowany kod XAML. Aby zrezygnować z tego zachowania, określ <?xaml-comp compile="false" ?> po nagłówku XML.

Przycinanie

Pełne przycinanie jest teraz obsługiwane przez ustawienie $(TrimMode) właściwości MSBuild na full. Aby uzyskać więcej informacji, zobacz Trim a .NET MAUI app (Przycinanie aplikacji MAUI platformy .NET).

Przycinanie niezgodności

Następujące funkcje programu .NET MAUI są niezgodne z pełnym przycinaniem i zostaną usunięte przez trymer:

Przycinanie przełączników funkcji

Program .NET MAUI zawiera dyrektywy trimmer znane jako przełączniki funkcji, które umożliwiają zachowanie kodu dla funkcji, które nie są bezpieczne. Te dyrektywy trimmer mogą być używane, gdy $(TrimMode) właściwość kompilacji jest ustawiona na full, a także dla nativeAOT:

Właściwość MSBuild opis
MauiEnableVisualAssemblyScanning W przypadku ustawienia wartości trueprogram .NET MAUI będzie skanować zestawy pod kątem typów implementowanych IVisual i dla [assembly:Visual(...)] atrybutów oraz będzie rejestrować te typy. Domyślnie ta właściwość kompilacji jest ustawiona na falsewartość .
MauiShellSearchResultsRendererDisplayMemberNameSupported Po ustawieniu falsewartości SearchHandler.DisplayMemberName na wartość wartość zostanie zignorowana. Zamiast tego należy podać element , ItemTemplate aby zdefiniować wygląd SearchHandler wyników. Domyślnie ta właściwość kompilacji jest ustawiona na truewartość .
MauiQueryPropertyAttributeSupport W przypadku ustawienia false[QueryProperty(...)] wartości atrybuty nie będą używane do ustawiania wartości właściwości podczas nawigowania. Zamiast tego należy zaimplementować IQueryAttributable interfejs w celu akceptowania parametrów zapytania. Domyślnie ta właściwość kompilacji jest ustawiona na truewartość .
MauiImplicitCastOperatorsUsageViaReflectionSupport W przypadku ustawienia falsewartości program .NET MAUI nie będzie szukać niejawnych operatorów konwersji podczas konwertowania wartości z jednego typu na inny. Może to mieć wpływ na powiązania między właściwościami z różnymi typami i ustawienie wartości właściwości obiektu możliwego do powiązania z wartością innego typu. Zamiast tego należy zdefiniować element TypeConverter dla typu i dołączyć go do typu przy użyciu atrybutu TypeConverterAttribute . Domyślnie ta właściwość kompilacji jest ustawiona na truewartość .
_MauiBindingInterceptorsSupport W przypadku ustawienia wartości falseprogram .NET MAUI nie przechwytuje żadnych wywołań metod SetBinding i nie spróbuje ich skompilować. Domyślnie ta właściwość kompilacji jest ustawiona na truewartość .
MauiEnableXamlCBindingWithSourceCompilation W przypadku ustawienia wartości trueprogram .NET MAUI skompiluje wszystkie powiązania, w tym te, w których Source jest używana właściwość. Jeśli włączysz tę funkcję, upewnij się, że wszystkie powiązania mają poprawne x:DataType , aby były kompilowane lub czyściły typ x:Data={x:Null}} danych, jeśli powiązanie nie powinno być kompilowane. Domyślnie ta właściwość kompilacji jest ustawiona true tylko wtedy, gdy jest włączone pełne przycinanie lub natywne wdrożenie AOT.

Te właściwości programu MSBuild mają również równoważne AppContext przełączniki:

  • Właściwość MauiEnableVisualAssemblyScanning MSBuild ma równoważny AppContext przełącznik o nazwie Microsoft.Maui.RuntimeFeature.IsIVisualAssemblyScanningEnabled.
  • Właściwość MauiShellSearchResultsRendererDisplayMemberNameSupported MSBuild ma równoważny AppContext przełącznik o nazwie Microsoft.Maui.RuntimeFeature.IsShellSearchResultsRendererDisplayMemberNameSupported.
  • Właściwość MauiQueryPropertyAttributeSupport MSBuild ma równoważny AppContext przełącznik o nazwie Microsoft.Maui.RuntimeFeature.IsQueryPropertyAttributeSupported.
  • Właściwość MauiImplicitCastOperatorsUsageViaReflectionSupport MSBuild ma równoważny AppContext przełącznik o nazwie Microsoft.Maui.RuntimeFeature.IsImplicitCastOperatorsUsageViaReflectionSupported.
  • Właściwość _MauiBindingInterceptorsSupport MSBuild ma równoważny AppContext przełącznik o nazwie Microsoft.Maui.RuntimeFeature.AreBindingInterceptorsSupported.
  • Właściwość MauiEnableXamlCBindingWithSourceCompilation MSBuild ma równoważny AppContext przełącznik o nazwie Microsoft.Maui.RuntimeFeature.MauiEnableXamlCBindingWithSourceCompilationEnabled.

Najprostszym sposobem korzystania z przełącznika funkcji jest umieszczenie odpowiedniej właściwości MSBuild w pliku projektu aplikacji (*.csproj), co powoduje przycięcie powiązanego kodu z zestawów .NET MAUI.

Kompilator XAML

W programie .NET MAUI 9 kody błędów kompilatora XAML zmieniły prefiks z XFC na XC. Upewnij się, że właściwości , $(WarningsNotAsErrors)i $(NoWarn) kompilacji są aktualizowane $(WarningsAsErrors)w plikach projektu aplikacji, jeśli są używane, aby odwołać się do nowego prefiksu.

Rozszerzenia struktury znaczników XAML

Wszystkie klasy, które implementują , , i muszą być oznaczone adnotacjami za pomocą elementu RequireServiceAttribute lub AcceptEmptyServiceProviderAttribute.IExtendedTypeConverter IValueProviderIMarkupExtension<T>IMarkupExtension Jest to wymagane ze względu na optymalizację kompilatora XAML wprowadzoną w programie .NET MAUI 9, która umożliwia generowanie bardziej wydajnego kodu, co pomaga zmniejszyć rozmiar aplikacji i zwiększyć wydajność środowiska uruchomieniowego.

Aby uzyskać informacje na temat dodawania adnotacji rozszerzeń znaczników za pomocą tych atrybutów, zobacz Dostawcy usług.

Synchronizacja programu Xcode

Program .NET MAUI 9 zawiera synchronizację Xcode (xcsync), która jest narzędziem umożliwiającym używanie programu Xcode do zarządzania plikami specyficznymi dla firmy Apple w projektach platformy .NET, w tym katalogami zasobów, plikami plist, scenorysami i plikami xib. Narzędzie ma dwa główne polecenia służące do generowania tymczasowego projektu Xcode z projektu platformy .NET i synchronizowania zmian z plików Xcode z powrotem do projektu platformy .NET.

Polecenia lub xcsync-sync służą dotnet build xcsync-generate do generowania lub synchronizowania tych plików oraz przekazywania pliku projektu i dodatkowych argumentów:

dotnet build /t:xcsync-generate
    /p:xcSyncProjectFile=<PROJECT>
    /p:xcSyncXcodeFolder=<TARGET_XCODE_DIRECTORY>
    /p:xcSyncTargetFrameworkMoniker=<FRAMEWORK>
    /p:xcSyncVerbosity=<LEVEL>

Aby uzyskać więcej informacji, zobacz Synchronizacja programu Xcode.

Przestarzałe interfejsy API

Program .NET MAUI 9 oznacza przestarzałe interfejsy API, które zostaną całkowicie usunięte w przyszłej wersji.

Ramka

Kontrolka Frame jest oznaczona jako przestarzała w programie .NET MAUI 9 i zostanie całkowicie usunięta w przyszłej wersji. Kontrolka Border powinna być używana w jego miejscu. Aby uzyskać więcej informacji, zobacz Obramowanie.

Strona główna

Zamiast definiować pierwszą stronę aplikacji przy użyciu MainPage właściwości obiektu Application , należy ustawić Page właściwość na Window pierwszej stronie aplikacji. Dzieje się to wewnętrznie w programie .NET MAUI podczas ustawiania MainPage właściwości, więc nie ma żadnych zmian zachowania wprowadzonych przez MainPage właściwość oznaczoną jako przestarzałą.

W poniższym przykładzie pokazano ustawienie Page właściwości w obiekcie Windowza pośrednictwem CreateWindow przesłonięcia:

public partial class App : Application
{
    public App()
    {
        InitializeComponent();
    }

    protected override Window CreateWindow(IActivationState? activationState)
    {
        return new Window(new AppShell());
    }
}

Właściwość MainPage jest zachowywana dla programu .NET MAUI 9, ale zostanie całkowicie usunięta w przyszłej wersji.

Układy zgodności

Klasy układu zgodności w Microsoft.Maui.Controls.Compatibility przestrzeni nazw zostały przestarzałe.

Starsze wywołania miar

Następujące VisualElement metody miary zostały przestarzałe:

Są to starsze metody miar, które nie działają poprawnie z oczekiwaniami układu MAUI platformy .NET.

W zamian wprowadzono metodę VisualElement.Measure(Double, Double) . Ta metoda zwraca minimalny rozmiar, którego potrzebuje element, aby był wyświetlany na urządzeniu. Marginesy są wykluczone z miary, ale są zwracane z rozmiarem. Jest to preferowana metoda wywoływana podczas mierzenia widoku.

Ponadto SizeRequest struktura jest przestarzała. Size Zamiast tego należy użyć polecenia .

.NET dla systemu Android

Platforma .NET dla systemu Android na platformie .NET 9, która dodaje obsługę interfejsu API 35, obejmuje pracę w celu skrócenia czasu kompilacji oraz zwiększenia możliwości przycinania aplikacji w celu zmniejszenia rozmiaru i zwiększenia wydajności. Aby uzyskać więcej informacji na temat platformy .NET dla systemu Android na platformie .NET 9, zobacz następujące informacje o wersji:

Pakiety zasobów

Platforma .NET dla systemu Android na platformie .NET 9 wprowadza możliwość umieszczania zasobów w osobnym pakiecie, znanym jako pakiet zasobów. Umożliwia to przekazywanie gier i aplikacji, które zwykle byłyby większe niż podstawowy rozmiar pakietu dozwolony przez Google Play. Umieszczając te zasoby w osobnym pakiecie, można przekazać pakiet o rozmiarze do 2 Gb, a nie podstawowy rozmiar pakietu o rozmiarze 200 Mb.

Ważne

Pakiety zasobów mogą zawierać tylko zasoby. W przypadku platformy .NET dla systemu Android oznacza to elementy, które mają akcję kompilacji AndroidAsset .

Aplikacje MAUI platformy .NET definiują zasoby za pośrednictwem akcji kompilacji MauiAsset . Pakiet zasobów można określić za pomocą atrybutu AssetPack :

<MauiAsset
    Include="Resources\Raw\**"
    LogicalName="%(RecursiveDir)%(Filename)%(Extension)"
    AssetPack="myassetpack" />

Uwaga

Dodatkowe metadane będą ignorowane przez inne platformy.

Jeśli masz określone elementy, które chcesz umieścić w pakiecie zasobów, możesz użyć atrybutu Update AssetPack do zdefiniowania metadanych:

<MauiAsset Update="Resources\Raw\MyLargeAsset.txt" AssetPack="myassetpack" />

Pakiety zasobów mogą mieć różne opcje dostarczania, które kontrolują, kiedy zasoby zostaną zainstalowane na urządzeniu:

  • Instalowane pakiety czasowe są instalowane w tym samym czasie co aplikacja. Ten typ pakietu może mieć rozmiar do 1 Gb, ale można mieć tylko jeden z nich. Ten typ dostarczania jest określony z metadanymi InstallTime .
  • Szybkie pakiety follow zostaną zainstalowane w pewnym momencie wkrótce po zakończeniu instalowania aplikacji. Aplikacja będzie mogła zostać uruchomiona, gdy ten typ pakietu jest instalowany, więc przed próbą użycia zasobów należy sprawdzić, czy instalacja została zakończona. Ten rodzaj pakietu zasobów może mieć rozmiar do 512 Mb. Ten typ dostarczania jest określony z metadanymi FastFollow .
  • Pakiety na żądanie nigdy nie zostaną pobrane na urządzenie, chyba że aplikacja zażąda jej specjalnie. Całkowity rozmiar wszystkich pakietów zasobów nie może przekraczać 2 Gb i może być maksymalnie 50 oddzielnych pakietów zasobów. Ten typ dostarczania jest określony z metadanymi OnDemand .

W aplikacjach MAUI platformy .NET typ dostarczania można określić za pomocą atrybutu DeliveryType na :MauiAsset

<MauiAsset Update="Resources\Raw\myvideo.mp4" AssetPack="myassetpack" DeliveryType="FastFollow" />

Aby uzyskać więcej informacji na temat pakietów zasobów systemu Android, zobacz Pakiety zasobów systemu Android.

Obsługa systemu Android 15

Platforma .NET dla systemu Android na platformie .NET 9 dodaje powiązania platformy .NET dla systemu Android 15 (INTERFEJS API 35). Aby skompilować te interfejsy API, zaktualizuj platformę docelową projektu na :net9.0-android

<TargetFramework>net9.0-android</TargetFramework>

Uwaga

Można również określić net9.0-android35 jako platformę docelową, ale liczba 35 prawdopodobnie zmieni się w przyszłych wersjach platformy .NET, aby dopasować nowsze wersje systemu operacyjnego Android.

Architektury 64-bitowe domyślnie

Platforma .NET dla systemu Android na platformie .NET 9 nie tworzy już następujących identyfikatorów środowiska uruchomieniowego (RID) domyślnie:

  • android-arm
  • android-x86

Powinno to poprawić czas kompilacji i zmniejszyć rozmiar plików systemu Android .apk . Pamiętaj, że sklep Google Play obsługuje dzielenie pakietów aplikacji na architekturę.

Jeśli musisz utworzyć dla tych architektur, możesz dodać je do pliku projektu (csproj):

<RuntimeIdentifiers>android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>

Lub w wielokierunkowym projekcie:

<RuntimeIdentifiers Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>

Metody marshalingu systemu Android

Ulepszenia metod marshalingu systemu Android na platformie .NET 9 sprawiły, że funkcja działała bardziej niezawodnie w aplikacjach, ale nie jest jeszcze domyślna. Włączenie tej funkcji spowodowało wzrost wydajności aplikacji testowej o około 10%.

Metody marshalingu systemu Android można włączyć w pliku projektu (csproj) za pomocą $(AndroidEnableMarshalMethods) właściwości :

<PropertyGroup>
    <AndroidEnableMarshalMethods>true</AndroidEnableMarshalMethods>
</PropertyGroup>

Aby uzyskać szczegółowe informacje na temat funkcji, zobacz dokumentację funkcji lub implementację w witrynie GitHub.

Ulepszenia przycinania

Na platformie .NET 9 zestawy interfejsu API systemu Android (Mono.Android.dll, Java.Interop.dll) są teraz w pełni zgodne z trim. Aby wyrazić zgodę na pełne przycinanie, ustaw $(TrimMode) właściwość w pliku projektu (csproj):

<PropertyGroup>
    <TrimMode>Full</TrimMode>
</PropertyGroup>

Umożliwia to również przycinanie analizatorów, dzięki czemu ostrzeżenia są wprowadzane dla dowolnego problematycznego kodu w języku C#.

Aby uzyskać więcej informacji, zobacz Trimming granularity (Przycinanie stopnia szczegółowości).

.NET dla systemu iOS

Platforma .NET 9 w systemach iOS, tvOS, Mac Catalyst i macOS używa środowiska Xcode 16.0 dla następujących wersji platformy:

  • iOS: 18.0
  • tvOS: 18.0
  • Mac Catalyst: 18.0
  • macOS: 15.0

Aby uzyskać więcej informacji na temat platformy .NET 9 w systemach iOS, tvOS, Mac Catalyst i macOS, zobacz następujące informacje o wersji:

Powiązania

Platforma .NET dla systemu iOS 9 wprowadza możliwość obsługi wielu wersji docelowych platformy .NET dla powiązań systemu iOS. Na przykład projekt biblioteki może wymagać skompilowania dwóch odrębnych wersji systemu iOS:

<TargetFrameworks>net9.0-ios17.0;net9.0-ios17.2</TargetFrameworks>

Spowoduje to wygenerowanie dwóch bibliotek, po jednym przy użyciu powiązań systemu iOS 17.0 i jednej przy użyciu powiązań systemu iOS 17.2.

Ważne

Projekt aplikacji powinien zawsze być przeznaczony dla najnowszego zestawu SDK systemu iOS.

Ulepszenia przycinania

W przypadku platformy .NET 9 zestawy iOS i Mac Catalyst (Microsoft.iOS.dll, Microsoft.MacCatalyst.dll itp.) są teraz w pełni zgodne. Aby wyrazić zgodę na pełne przycinanie, ustaw $(TrimMode) właściwość w pliku projektu (csproj):

<PropertyGroup>
    <TrimMode>Full</TrimMode>
</PropertyGroup>

Umożliwia to również przycinanie analizatorów, dzięki czemu ostrzeżenia są wprowadzane dla dowolnego problematycznego kodu w języku C#.

Aby uzyskać więcej informacji, zobacz Trimming granularity (Przycinanie stopnia szczegółowości).

Natywna AOT dla systemów iOS i Mac Catalyst

Na platformie .NET dla systemu iOS 9 natywna kompilacja AOT (AOT) dla systemów iOS i Mac Catalyst wykorzystuje pełne przycinanie w celu zmniejszenia rozmiaru pakietu aplikacji i wydajności uruchamiania. NativeAOT opiera się na pełnym przycinaniu, decydując się również na nowe środowisko uruchomieniowe.

Ważne

Aplikacja i jej zależności muszą być w pełni przycinane, aby można było korzystać z tej funkcji.

Funkcja NativeAOT wymaga, aby aplikacje zostały skompilowane przy użyciu ostrzeżeń o zerowym poziomie, aby udowodnić, że aplikacja będzie działać poprawnie w czasie wykonywania.

Zobacz też