Bagikan melalui


Apa yang baru di .NET MAUI untuk .NET 9

Fokus UI Aplikasi Multi-platform .NET (.NET MAUI) di .NET 9 adalah untuk meningkatkan kualitas produk. Ini termasuk memperluas cakupan pengujian, pengujian skenario ujung ke ujung, dan perbaikan bug. Untuk informasi selengkapnya tentang peningkatan kualitas produk di .NET MAUI 9, lihat catatan rilis berikut:

Penting

Karena bekerja dengan dependensi eksternal, seperti Xcode atau Android SDK Tools, kebijakan dukungan .NET MAUI berbeda dari kebijakan dukungan .NET dan .NET Core. Untuk informasi selengkapnya, lihat Kebijakan dukungan .NET MAUI.

Di .NET 9, .NET MAUI dikirim sebagai beban kerja .NET dan beberapa paket NuGet. Keuntungan dari pendekatan ini adalah memungkinkan Anda untuk dengan mudah menyematkan proyek Anda ke versi tertentu, sekaligus memungkinkan Anda untuk dengan mudah mempratinjau build yang belum dilepas atau eksperimental. Saat Anda membuat proyek .NET MAUI baru, paket NuGet yang diperlukan secara otomatis ditambahkan ke proyek.

Target penyebaran minimum

.NET MAUI 9 memerlukan target penyebaran minimum iOS 12.2, dan Mac Catalyst 15.0 (macOS 12.0). Target penyebaran minimum Android dan Windows tetap sama. Untuk informasi selengkapnya, lihat Platform yang didukung untuk aplikasi .NET MAUI.

Kontrol baru

.NET MAUI 9 menyertakan dua kontrol baru.

HybridWebView

HybridWebView memungkinkan hosting konten HTML/JS/CSS arbitrer dalam tampilan web, dan memungkinkan komunikasi antara kode dalam tampilan web (JavaScript) dan kode yang menghosting tampilan web (C#/.NET). Misalnya, jika Anda memiliki aplikasi React JS yang ada, Anda dapat menghostingnya di aplikasi asli .NET MAUI lintas platform, dan membangun back-end aplikasi menggunakan C# dan .NET.

Untuk membangun aplikasi .NET MAUI dengan HybridWebView Anda memerlukan:

  • Konten web aplikasi, yang terdiri dari HTML statis, JavaScript, CSS, gambar, dan file lainnya.
  • HybridWebView Kontrol sebagai bagian dari UI aplikasi. Ini dapat dicapai dengan mereferensikannya di XAML aplikasi.
  • Kode dalam konten web, dan di C#/.NET, yang menggunakan HybridWebView API untuk mengirim pesan di antara kedua komponen.

Seluruh aplikasi, termasuk konten web, dipaketkan dan dijalankan secara lokal di perangkat, dan dapat diterbitkan ke penyimpanan aplikasi yang berlaku. Konten web dihosting dalam kontrol tampilan web asli dan berjalan dalam konteks aplikasi. Bagian mana pun dari aplikasi dapat mengakses layanan web eksternal, tetapi tidak diperlukan.

Untuk informasi selengkapnya, lihat HybridWebView.

Bilah Judul untuk Windows

Kontrol ini TitleBar menyediakan kemampuan untuk menambahkan bilah judul kustom ke aplikasi Anda di Windows:

Gambaran umum Bilah Judul .NET MAUI.

TitleBar dapat ditetapkan sebagai nilai Window.TitleBar properti pada setiap Window:

<Window.TitleBar>
    <TitleBar x:Name="TeamsTitleBar"
              Title="Hello World"
              Icon="appicon.png"
              HeightRequest="46">
        <TitleBar.Content>
            <Entry x:Name="SearchTitleBar"
                   Placeholder="Search"
                   VerticalOptions="Center"
                   MinimumWidthRequest="300"
                   MaximumWidthRequest="450"
                   HeightRequest="32"/>
        </TitleBar.Content>
    </TitleBar>
</Window.TitleBar>

Contoh penggunaannya dalam C# adalah:

Window.TitleBar = new TitleBar
{
    Title = "MAUI App",
    Icon = "appicon.png",
    HeightRequest = 46,
    LeadingContent = new AvatarButton()
};

A TitleBar sangat dapat disesuaikan melalui Contentproperti , , LeadingContentdan TrailingContent :

<TitleBar Title="My App"
          BackgroundColor="#512BD4"
          HeightRequest="48">
    <TitleBar.Content>
        <SearchBar Placeholder="Search"
                   MaximumWidthRequest="300"
                   HorizontalOptions="FillAndExpand"
                   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>

Cuplikan layar berikut menunjukkan tampilan yang dihasilkan:

Cuplikan layar Bilah Judul .NET MAUI.

Catatan

Dukungan Mac Catalyst untuk TitleBar kontrol akan ditambahkan dalam rilis mendatang.

Penyempurnaan kontrol

.NET MAUI 9 mencakup peningkatan kontrol.

Mode pengikatan BackButtonBehavior OneWay

Mode pengikatan untuk IsVisible dan IsEnabled pada BackButtonBehavior di aplikasi Shell sekarang BindingMode.OneWay bukan BindingMode.OneTime. Ini memungkinkan Anda untuk lebih mudah mengontrol perilaku tombol kembali saat runtime, dengan pengikatan data:

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

BlazorWebView

Di iOS dan Mac Catalyst 18, .NET MAUI 9 mengubah perilaku default untuk menghosting konten di menjadi BlazorWebView localhost. Alamat internal 0.0.0.0 yang digunakan untuk menghosting konten tidak lagi berfungsi dan menghasilkan BlazorWebView tidak memuat konten apa pun dan penyajian sebagai persegi panjang kosong.

Untuk memilih menggunakan 0.0.0.0 alamat, tambahkan kode berikut ke CreateMauiApp metode di MauiProgram.cs:

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

Jika Anda mengalami hang di Android, BlazorWebView Anda harus mengaktifkan sakelar AppContext dalam CreateMauiApp metode di kelas Anda MauiProgram :

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

Sakelar ini memungkinkan BlazorWebView untuk menembak dan melupakan pembuangan asinkron yang terjadi, dan sebagai hasilnya memperbaiki sebagian besar kebuntuan pembuangan yang terjadi di Android. Untuk informasi selengkapnya, lihat Memperbaiki kebuntuan pembuangan di Android.

CollectionView dan CarouselView

.NET MAUI 9 mencakup dua handler baru opsional di iOS dan Mac Catalyst yang menghadirkan peningkatan performa dan stabilitas ke CollectionView dan CarouselView. Handler ini didasarkan pada UICollectionView API.

Untuk memilih menggunakan handler ini, tambahkan kode berikut ke kelas Anda MauiProgram :

#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

Di .NET MAUI 9, HideSoftInputOnTapped properti ini juga didukung di Mac Catalyst, serta Android dan iOS.

Dukungan input keyboard lunak

.NET MAUI 9 menambahkan dukungan input keyboard lunak baru untuk Password, , Datedan Time. Ini dapat diaktifkan dan Editor Entry kontrol:

<Entry Keyboard="Date" />

Perataan teks

Enumerasi TextAlignment menambahkan Justify anggota yang dapat digunakan untuk meratakan teks dalam kontrol teks. Misalnya, Anda dapat meratakan teks secara horizontal dalam Label dengan HorizontalTextAlignment.Justify:

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

TimePicker

TimePickerTimeSelected mendapatkan peristiwa, yang dimunculkan saat waktu yang dipilih berubah. Objek TimeChangedEventArgs yang menyertai TimeSelected peristiwa memiliki NewTime properti dan OldTime , yang masing-masing menentukan waktu baru dan lama.

WebView

WebViewProcessTerminated menambahkan peristiwa yang dimunculkan saat WebView proses berakhir secara tak terduga. Objek WebViewProcessTerminatedEventArgs yang menyertai peristiwa ini mendefinisikan properti khusus platform yang menunjukkan mengapa proses gagal.

Siklus hidup aplikasi

.NET MAUI 9 menambahkan metode siklus hidup pemberitahuan jarak jauh berikut di iOS dan Mac Catalyst:

  • RegisteredForRemoteNotifications, yang dipanggil ketika aplikasi telah berhasil mendaftar untuk pemberitahuan jarak jauh.
  • ReceivedRemoteNotifications, yang dipanggil ketika pemberitahuan jarak jauh diterima.

Contoh berikut menunjukkan cara menggunakan metode siklus hidup ini:

using Microsoft.Maui.LifecycleEvents;

namespace PlatformLifecycleDemo;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureLifecycleEvents(events =>
            {
#if IOS || MACCATALYST
                events.AddiOS(ios => ios
                    .ReceivedRemoteNotifications((app, dictionary) => LogEvent(nameof(iOSLifecycle.OnReceivedRemoteNotifications)))
                    .RegisteredForRemoteNotifications((app, data) => LogEvent(nameof(iOSLifecycle.OnRegisteredForRemoteNotifications)));
#endif
                static bool LogEvent(string eventName, string type = null)
                {
                    System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                    return true;
                }
            });

        return builder.Build();
    }
}

Pengikatan yang dikompilasi dalam kode

Pengikatan yang ditulis dalam kode biasanya menggunakan jalur string yang diselesaikan pada runtime dengan pantulan, dan overhead melakukan ini bervariasi dari platform ke platform. .NET MAUI 9 memperkenalkan metode ekstensi tambahan SetBinding yang menentukan pengikatan menggunakan Func argumen alih-alih jalur string:

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

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

Pendekatan pengikatan yang dikompilasi ini memberikan manfaat berikut:

  • Meningkatkan performa pengikatan data dengan menyelesaikan ekspresi pengikatan pada waktu kompilasi daripada runtime.
  • Pengalaman pemecahan masalah pengembang yang lebih baik karena pengikatan yang tidak valid dilaporkan sebagai kesalahan build.
  • Intellisense saat mengedit.

Tidak semua metode dapat digunakan untuk menentukan pengikatan yang dikompilasi. Ekspresi harus berupa ekspresi akses properti sederhana. Contoh berikut menunjukkan ekspresi pengikatan yang valid dan tidak valid:

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

Selain itu, .NET MAUI 9 menambahkan Binding.Create metode yang mengatur pengikatan langsung pada objek dengan Func, dan mengembalikan instans objek pengikatan:

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

Penting

Pengikatan yang dikompilasi diperlukan alih-alih pengikatan berbasis string di aplikasi NativeAOT, dan di aplikasi dengan pemangkasan penuh diaktifkan.

Pengikatan yang dikompilasi di XAML

Di .NET MAUI 8, pengikatan yang dikompilasi dinonaktifkan untuk ekspresi pengikatan XAML apa pun yang menentukan Source properti, dan tidak didukung pada multi-pengikatan. Pembatasan ini telah dihapus di .NET MAUI 9.

Secara default, .NET MAUI tidak menghasilkan peringatan build untuk pengikatan yang tidak menggunakan pengikatan yang dikompilasi, kecuali Anda telah mengaktifkan NativeAOT untuk aplikasi Anda. Namun, Anda dapat memilih untuk mengikat peringatan yang dikompilasi yang diproduksi dengan mengatur $(MauiStrictXamlCompilation) properti build ke true dalam file proyek aplikasi Anda (*.csproj):

<MauiStrictXamlCompilation>true</MauiStrictXamlCompilation>

Pemutusan handler

Saat menerapkan kontrol kustom menggunakan handler, setiap implementasi handler platform diperlukan untuk mengimplementasikan DisconnectHandler metode , untuk melakukan pembersihan tampilan asli seperti berhenti berlangganan dari peristiwa. Namun, sebelum .NET MAUI 9, DisconnectHandler implementasinya sengaja tidak dipanggil oleh .NET MAUI. Sebagai gantinya, Anda harus memanggilnya sendiri saat memilih untuk membersihkan kontrol, seperti saat menavigasi mundur di aplikasi.

Di .NET MAUI 9, handler secara otomatis memutuskan sambungan dari kontrol mereka jika memungkinkan, seperti saat menavigasi mundur di aplikasi. Dalam beberapa skenario, Anda mungkin tidak menginginkan perilaku ini. Oleh karena itu, .NET MAUI 9 menambahkan HandlerProperties.DisconnectPolicy properti terlampir untuk mengontrol kapan handler terputus dari kontrolnya. Properti ini memerlukan HandlerDisconnectPolicy argumen, dengan HandlerDisconnectPolicy enumerasi yang menentukan nilai berikut:

  • Automatic, yang menunjukkan bahwa handler akan terputus secara otomatis. Ini adalah nilai default properti HandlerProperties.DisconnectPolicy terlampir.
  • Manual, yang menunjukkan bahwa handler harus terputus secara manual dengan memanggil DisconnectHandler implementasi.

Contoh berikut menunjukkan pengaturan HandlerProperties.DisconnectPolicy properti terlampir:

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

Kode C# yang setara adalah:

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

Selain itu, ada DisconnectHandlers metode ekstensi yang memutuskan penghandel dari IView:

video.DisconnectHandlers();

Saat memutuskan sambungan, DisconnectHandlers metode akan menyebar ke bawah pohon kontrol sampai selesai atau tiba pada kontrol yang telah menetapkan kebijakan manual.

Dukungan multi-jendela

.NET MAUI 9 menambahkan kemampuan untuk membawa jendela tertentu ke depan di Mac Catalyst dan Windows dengan Application.Current.ActivateWindow metode :

Application.Current?.ActivateWindow(windowToActivate);

Penyematan asli

.NET MAUI 9 menyertakan API penuh untuk skenario penyematan asli, yang sebelumnya harus ditambahkan secara manual ke proyek Anda:

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

Atau, Anda dapat menggunakan metode , ToPlatformEmbedded meneruskan Window untuk platform tempat aplikasi berjalan:

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

Dalam kedua contoh, nativeView adalah versi khusus platform dari mauiView.

Untuk melakukan bootstrap aplikasi asli yang disematkan di .NET MAUI 9, panggil UseMauiEmbeddedApp metode ekstensi pada objek Anda MauiAppBuilder :

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

        builder
            .UseMauiEmbeddedApp<App>();

        return builder.Build();
    }
}

Template Proyek

.NET MAUI 9 menambahkan templat proyek .NET MAUI Blazor Hybrid dan Web App ke Visual Studio yang membuat solusi dengan aplikasi .NET MAUI Blazor Hybrid dengan aplikasi Blazor Web, yang berbagi kode umum dalam proyek pustaka kelas Razor.

Templat juga dapat digunakan dari dotnew new:

dotnet new maui-blazor-web -n AllTheTargets

Kamus sumber daya

Di .NET MAUI 9, XAML ResourceDictionary yang berdiri sendiri (yang tidak didukung oleh file code-behind) default untuk mengkompilasi XAML-nya. Untuk menolak perilaku ini, tentukan <?xaml-comp compile="false" ?> setelah header XML.

Pemangkasan sakelar fitur

Beberapa area .NET MAUI dilengkapi dengan arahan pemangkas, yang dikenal sebagai sakelar fitur, yang memungkinkan untuk menghapus kode untuk fitur yang dinonaktifkan ketika TrimMode=full, serta untuk NativeAOT:

Properti MSBuild Deskripsi
MauiEnableVisualAssemblyScanning Ketika diatur ke true, .NET MAUI akan memindai rakitan untuk jenis yang menerapkan IVisual dan untuk [assembly:Visual(...)] atribut, dan akan mendaftarkan jenis ini. Secara default, properti build ini diatur ke false.
MauiShellSearchResultsRendererDisplayMemberNameSupported Ketika diatur ke false, nilai SearchHandler.DisplayMemberName akan diabaikan. Sebagai gantinya, Anda harus memberikan ItemTemplate untuk menentukan tampilan SearchHandler hasil. Secara default, properti build ini diatur ke true.
MauiQueryPropertyAttributeSupport Saat diatur ke false, [QueryProperty(...)] atribut tidak akan digunakan untuk mengatur nilai properti saat menavigasi. Sebagai gantinya IQueryAttributable , Anda harus menerapkan antarmuka untuk menerima parameter kueri. Secara default, properti build ini diatur ke true.
MauiImplicitCastOperatorsUsageViaReflectionSupport Saat diatur ke false, .NET MAUI tidak akan mencari operator cast implisit saat mengonversi nilai dari satu jenis ke jenis lainnya. Ini dapat memengaruhi pengikatan antara properti dengan jenis yang berbeda, dan mengatur nilai properti dari objek yang dapat diikat dengan nilai dari jenis yang berbeda. Sebagai gantinya, Anda harus menentukan TypeConverter untuk jenis Anda dan melampirkannya ke jenis menggunakan [TypeConverter(typeof(MyTypeConverter))] atribut . Secara default, properti build ini diatur ke true.
_MauiBindingInterceptorsSupport Ketika diatur ke false, .NET MAUI tidak akan mencegat panggilan apa pun ke SetBinding metode dan tidak akan mencoba mengkompilasinya. Secara default, properti build ini diatur ke true.

Untuk menggunakan sakelar fitur, Anda harus memasukkan properti MSBuild yang sesuai ke dalam file proyek aplikasi Anda (*.csproj), yang menyebabkan kode terkait dipangkas dari rakitan .NET MAUI. Menonaktifkan fitur yang tidak diperlukan aplikasi dapat membantu mengurangi ukuran aplikasi saat dikombinasikan Full dengan mode pemangkasan.

XAML

Semua kelas yang mengimplementasikan IMarkupExtension, IMarkupExtension<T>, IValueProvider, dan IExtendedTypeConverter perlu diannotasi dengan RequireServiceAttribute atau AcceptEmptyServiceProviderAttribute. Ini diperlukan karena pengoptimalan kompilator XAML yang diperkenalkan di .NET MAUI 9 yang memungkinkan pembuatan kode yang lebih efisien, yang membantu mengurangi ukuran aplikasi dan meningkatkan performa runtime.

Untuk informasi tentang menganotasi ekstensi markup dengan atribut ini, lihat Penyedia layanan.

Sinkronisasi Xcode

.NET MAUI 9 mencakup sinkronisasi Xcode (xcsync), yang merupakan alat yang memungkinkan Anda menggunakan Xcode untuk mengelola file spesifik Apple dengan proyek .NET, termasuk katalog aset, file plist, papan cerita, dan file xib. Alat ini memiliki dua perintah utama untuk menghasilkan proyek Xcode sementara dari proyek .NET, dan untuk menyinkronkan perubahan dari file Xcode kembali ke proyek .NET Anda.

Anda menggunakan dotnet build dengan xcsync-generate perintah atau xcsync-sync , untuk membuat atau menyinkronkan file-file ini, dan meneruskan file proyek dan argumen tambahan:

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

Untuk informasi selengkapnya, lihat Sinkronisasi Xcode.

API yang tidak digunakan lagi

.NET MAUI 9 menghentikan beberapa API, yang akan dihapus sepenuhnya dalam rilis mendatang.

Menengah

Kontrol Frame ditandai sebagai usang di .NET MAUI 9, dan akan dihapus sepenuhnya dalam rilis mendatang. Border Kontrol harus digunakan di tempatnya. Untuk informasi selengkapnya, lihat Batas.

MainPage

Alih-alih menentukan halaman pertama aplikasi Anda menggunakan MainPage properti pada Application objek, Anda harus mengatur Page properti pada Window halaman pertama aplikasi Anda. Inilah yang terjadi secara internal di .NET MAUI saat Anda mengatur MainPage properti, sehingga tidak ada perubahan perilaku yang diperkenalkan oleh MainPage properti yang ditandai sebagai usang.

Contoh berikut menunjukkan pengaturan Page properti pada Window, melalui penimpaan CreateWindow :

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

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

Properti MainPage dipertahankan untuk .NET MAUI 9, tetapi akan dihapus sepenuhnya dalam rilis mendatang.

Tata letak kompatibilitas

Kelas tata letak kompatibilitas di Microsoft.Maui.Controls.Compatibility namespace telah usang.

Panggilan pengukuran warisan

Metode pengukuran warisan berikut VisualElement telah usang:

  • protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint).
  • public virtual SizeRequest Measure(double widthConstraint, double heightConstraint, MeasureFlags flags = MeasureFlags.None) dari VisualElement.

Sebagai pengganti, metode berikut telah diperkenalkan:

  • public size Measure(double widthConstraint, double heightConstraint)

Metode ini Measure mengembalikan ukuran minimum yang dibutuhkan elemen untuk ditampilkan pada perangkat. Margin dikecualikan dari pengukuran, tetapi dikembalikan dengan ukurannya. Ini adalah metode yang disukai untuk dipanggil saat mengukur tampilan.

Selain itu, Microsoft.Maui.SizeRequest struktur usang. Sebagai gantinya, Microsoft.Maui.Size harus digunakan.

.NET untuk Android

.NET untuk Android 9, yang menambahkan dukungan untuk API 35, termasuk pekerjaan untuk mengurangi waktu build, dan untuk meningkatkan trimability aplikasi untuk mengurangi ukuran dan meningkatkan performa. Untuk informasi selengkapnya tentang .NET untuk Android 9, lihat catatan rilis berikut:

Paket aset

.NET untuk Android 9 memperkenalkan kemampuan untuk menempatkan aset ke dalam paket terpisah, yang dikenal sebagai paket aset. Ini memungkinkan Anda untuk mengunggah game dan aplikasi yang biasanya lebih besar dari ukuran paket dasar yang diizinkan oleh Google Play. Dengan memasukkan aset ini ke dalam paket terpisah, Anda mendapatkan kemampuan untuk mengunggah paket yang berukuran hingga 2Gb, daripada ukuran paket dasar 200Mb.

Penting

Paket aset hanya dapat berisi aset. Dalam kasus .NET untuk Android, ini berarti item yang memiliki AndroidAsset tindakan build.

Aplikasi MAUI .NET menentukan aset melalui MauiAsset tindakan build. Paket aset dapat ditentukan melalui AssetPack atribut :

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

Catatan

Metadata tambahan akan diabaikan oleh platform lain.

Jika Anda memiliki item tertentu yang ingin Anda tempatkan dalam paket aset, Anda dapat menggunakan Update atribut untuk menentukan AssetPack metadata:

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

Paket aset dapat memiliki opsi pengiriman yang berbeda, yang mengontrol kapan aset Anda akan diinstal pada perangkat:

  • Paket waktu penginstalan diinstal pada saat yang sama dengan aplikasi. Jenis paket ini bisa berukuran hingga 1Gb, tetapi Anda hanya dapat memiliki salah satunya. Jenis pengiriman ini ditentukan dengan InstallTime metadata.
  • Paket ikuti cepat akan diinstal pada beberapa titik segera setelah aplikasi selesai diinstal. Aplikasi akan dapat dimulai saat jenis paket ini sedang diinstal sehingga Anda harus memeriksanya telah selesai diinstal sebelum mencoba menggunakan aset. Paket aset semacam ini dapat berukuran hingga 512Mb. Jenis pengiriman ini ditentukan dengan FastFollow metadata.
  • Paket sesuai permintaan tidak akan pernah diunduh ke perangkat kecuali aplikasi secara khusus memintanya. Ukuran total semua paket aset Anda tidak boleh melebihi 2Gb, dan Anda dapat memiliki hingga 50 paket aset terpisah. Jenis pengiriman ini ditentukan dengan OnDemand metadata.

Di aplikasi .NET MAUI, jenis pengiriman dapat ditentukan dengan DeliveryType atribut pada MauiAsset:

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

Untuk informasi selengkapnya tentang paket aset Android, lihat Paket aset Android.

Dukungan Android 15

.NET untuk Android 9 menambahkan pengikatan .NET untuk Android 15 (API 35). Untuk membangun API ini, perbarui kerangka kerja target proyek Anda:

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

Metode marshalled LLVM

Metode marshalled Komputer Virtual tingkat rendah (LLVM) sekarang diaktifkan secara default di .NET untuk Android 9 di aplikasi non-Blazor. Ini telah menghasilkan peningkatan ~ 10% dalam performa dalam aplikasi pengujian.

Metode marshalled LLVM dapat dinonaktifkan dalam file proyek Anda (.csproj):

<PropertyGroup Condition="'$(TargetFramework)' == 'net9.0-android'">
    <AndroidEnableLLVM>false</AndroidEnableLLVM>
    <AndroidEnableLLVMOptimizations>false</AndroidEnableLLVMOptimizations>
</PropertyGroup>

Peningkatan pemangkasan

.NET untuk Android 9 menyertakan perbaikan saat menggunakan pemangkasan penuh untuk mengurangi ukuran aplikasi. Pemangkasan penuh biasanya hanya diaktifkan untuk build rilis aplikasi Anda, dan dapat dikonfigurasi dalam file proyek Anda (.csproj):

<PropertyGroup Condition="'$(Configuration)' == 'Release' And '$(TargetFramework)' == 'net9.0-android'">
    <TrimMode>Full</TrimMode>
</PropertyGroup>

.NET untuk iOS

.NET 9 di iOS, tvOS, Mac Catalyst, dan macOS menggunakan Xcode 15.4 untuk versi platform berikut:

  • iOS: 17.5
  • tvOS: 17.5
  • Mac Catalyst: 17.5
  • macOS: 14.5

Untuk informasi selengkapnya tentang .NET 9 di iOS, tvOS, Mac Catalyst, dan macOS, lihat catatan rilis berikut:

Pengikatan

.NET untuk iOS 9 memperkenalkan kemampuan untuk versi multi-target .NET untuk pengikatan iOS. Misalnya, proyek pustaka mungkin perlu dibuat untuk dua versi iOS yang berbeda:

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

Ini akan menghasilkan dua pustaka, satu menggunakan pengikatan iOS 17.0, dan satu menggunakan pengikatan iOS 17.2.

Penting

Proyek aplikasi harus selalu menargetkan iOS SDK terbaru.

AOT Asli untuk iOS & Mac Catalyst

Di .NET untuk iOS 9, kompilasi Ahead of Time (AOT) asli untuk iOS dan Mac Catalyst memanfaatkan pemangkasan penuh untuk mengurangi ukuran paket aplikasi dan performa startup Anda. Ini adalah fitur penerbitan yang dapat Anda gunakan saat siap untuk mengirim aplikasi.

Penting

Aplikasi Anda dan dependensinya harus sepenuhnya dapat dipangkas untuk menggunakan fitur ini.

Lihat juga