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:
- .NET MAUI 9 RC2
- .NET MAUI 9 RC1
- .NET MAUI 9 (wersja zapoznawcza 7)
- .NET MAUI 9 (wersja zapoznawcza 6)
- .NET MAUI 9 (wersja zapoznawcza 5)
- .NET MAUI 9 (wersja zapoznawcza 4)
- .NET MAUI 9 (wersja zapoznawcza 3)
- .NET MAUI 9 (wersja zapoznawcza 2)
- .NET MAUI 9 (wersja zapoznawcza 1)
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:
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=""
FontFamily="SegoeMDL2"/>
</ImageButton.Source>
</ImageButton>
</TitleBar.TrailingContent>
</TitleBar>
Poniższy zrzut ekranu przedstawia wynikowy wygląd:
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
, Date
i 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ą Func
klasy , 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łączonejHandlerProperties.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:
- Wyrażenia powiązań, w których ta ścieżka powiązania jest ustawiona na ciąg. Zamiast tego użyj skompilowanych powiązań. Aby uzyskać więcej informacji, zobacz Skompilowane powiązania.
- Niejawne operatory konwersji podczas przypisywania wartości niezgodnego typu do właściwości w języku XAML lub gdy dwie właściwości różnych typów używają powiązania danych. Zamiast tego należy zdefiniować element TypeConverter dla typu i dołączyć go do typu przy użyciu elementu TypeConverterAttribute. Aby uzyskać więcej informacji, zobacz Define a TypeConverter to replace an implicit conversion operator (Definiowanie operatora konwersji niejawnej).
- Ładowanie kodu XAML w czasie wykonywania za LoadFromXaml pomocą metody rozszerzenia. Ten kod XAML można bezpiecznie przycinać, dodając adnotacje do wszystkich typów, które można załadować w czasie wykonywania za pomocą atrybutu
DynamicallyAccessedMembers
lub atrybutuDynamicDependency
. Jest to jednak bardzo podatne na błędy i nie jest zalecane. - Odbieranie danych nawigacji przy użyciu elementu QueryPropertyAttribute. Zamiast tego należy zaimplementować IQueryAttributable interfejs dla typów, które muszą akceptować parametry zapytania. Aby uzyskać więcej informacji, zobacz Przetwarzanie danych nawigacji przy użyciu jednej metody.
- Właściwość
SearchHandler.DisplayMemberName
. Zamiast tego należy podać element , ItemTemplate aby zdefiniować wygląd SearchHandler wyników. Aby uzyskać więcej informacji, zobacz Definiowanie wyglądu elementu wyników wyszukiwania.
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 true program .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 false wartość . |
MauiShellSearchResultsRendererDisplayMemberNameSupported |
Po ustawieniu false wartoś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 true wartość . |
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 true wartość . |
MauiImplicitCastOperatorsUsageViaReflectionSupport |
W przypadku ustawienia false wartoś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 true wartość . |
_MauiBindingInterceptorsSupport |
W przypadku ustawienia wartości false program .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 true wartość . |
MauiEnableXamlCBindingWithSourceCompilation |
W przypadku ustawienia wartości true program .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 nazwieMicrosoft.Maui.RuntimeFeature.IsIVisualAssemblyScanningEnabled
. - Właściwość
MauiShellSearchResultsRendererDisplayMemberNameSupported
MSBuild ma równoważny AppContext przełącznik o nazwieMicrosoft.Maui.RuntimeFeature.IsShellSearchResultsRendererDisplayMemberNameSupported
. - Właściwość
MauiQueryPropertyAttributeSupport
MSBuild ma równoważny AppContext przełącznik o nazwieMicrosoft.Maui.RuntimeFeature.IsQueryPropertyAttributeSupported
. - Właściwość
MauiImplicitCastOperatorsUsageViaReflectionSupport
MSBuild ma równoważny AppContext przełącznik o nazwieMicrosoft.Maui.RuntimeFeature.IsImplicitCastOperatorsUsageViaReflectionSupported
. - Właściwość
_MauiBindingInterceptorsSupport
MSBuild ma równoważny AppContext przełącznik o nazwieMicrosoft.Maui.RuntimeFeature.AreBindingInterceptorsSupported
. - Właściwość
MauiEnableXamlCBindingWithSourceCompilation
MSBuild ma równoważny AppContext przełącznik o nazwieMicrosoft.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 Window
za 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:
- .NET dla systemu Android 9 RC2
- .NET dla systemu Android 9 RC1
- .NET dla systemu Android 9 (wersja zapoznawcza 7)
- .NET dla systemu Android 9 (wersja zapoznawcza 6)
- .NET dla systemu Android 9 (wersja zapoznawcza 5)
- .NET dla systemu Android 9 (wersja zapoznawcza 4)
- .NET dla systemu Android 9 (wersja zapoznawcza 3)
- .NET dla systemu Android 9 (wersja zapoznawcza 2)
- .NET dla systemu Android 9 (wersja zapoznawcza 1)
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:
- .NET 9.0.1xx RC2
- .NET 9.0.1xx RC1
- .NET 9.0.1xx (wersja zapoznawcza 7)
- .NET 9.0.1xx (wersja zapoznawcza 6)
- .NET 9.0.1xx (wersja zapoznawcza 5)
- .NET 9.0.1xx (wersja zapoznawcza 4)
- .NET 9.0.1xx (wersja zapoznawcza 3)
- .NET 9.0.1xx (wersja zapoznawcza 2)
- .NET 9.0.1xx (wersja zapoznawcza 1)
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.