適用於 .NET 8 的 .NET MAUI 新功能
.NET MAUI 在 .NET 8 中的重點在於品質。 在 .NET 8 中,已合併 1618 個提取要求,已關閉 689 個問題。 其中包括來自 .NET MAUI 小組以及 .NET MAUI 社群的變更。 這些變更應該會導致 .NET 8 的品質大幅增加。
重要
由於使用基礎外部相依性,例如 Xcode 或 Android SDK 工具,所以 .NET 多平臺應用程式 UI (.NET MAUI) 支援原則與 .NET 和 .NET Core 支持原則不同。 如需詳細資訊,請參閱 .NET MAUI 支持原則。
在 .NET 8 中,.NET MAUI 會隨附為 .NET 工作負載和多個 NuGet 套件。 這種方法的優點是可讓您輕鬆地將專案釘選到特定版本,同時可讓您輕鬆地預覽未發行或實驗性組建。 當您建立新的 .NET MAUI 專案時,必要的 NuGet 套件會自動新增至專案。
本文列出 .NET MAUI for .NET 8 的新功能,並提供每個版本詳細信息的連結。
如需 .NET 8 新功能的相關信息,請參閱 .NET 8 的新功能。
新功能
雖然此版本 .NET MAUI 的重點在於品質,但也有一些新功能可在您的應用程式中啟用新的案例。
控制項
- 支援文字輸入增益擴充方法的控件,可支援隱藏和顯示軟式輸入鍵盤。 如需詳細資訊,請參閱 隱藏和顯示軟式輸入鍵盤。
- 類別 ContentPage 會取得 HideSoftInputOnTapped 屬性,指出點選頁面上的任何位置是否會導致虛輸入鍵盤在可見時隱藏。 如需詳細資訊,請參閱 ContentPage。
- BlazorWebViewStartPath取得屬性、TryDispatchAsync方法和增強的記錄功能。 如需詳細資訊,請參閱 使用 BlazorWebView 在 .NET MAUI 應用程式中裝載 Blazor Web 應用程式。
- WebViewUserAgent取得屬性。 如需詳細資訊,請參閱 WebView。
- 預設 WebView 已在 iOS 上啟用 HTML5 視訊的內嵌媒體播放,包括自動播放和圖片中的圖片。 如需詳細資訊,請參閱 在 iOS 和 Mac Catalyst 上設定媒體播放喜好設定。
Grid.Add
接受 5 個自變數的多載已新增回 .NET MAUI。 不過,這個方法已被取代,而且只存在以協助從 Xamarin.Forms 移轉。- GridAddWithSpan會取得擴充方法,這個方法會將檢視加入至Grid具有指定數據列和數據行範圍的指定數據列和數據行。
桌面
- 功能表欄專案和操作功能表項可以透過稱為鍵盤快捷鍵的鍵盤快捷方式來叫用。 如需詳細資訊,請參閱 鍵盤快捷方式。
- Windows 應用程式可以發佈為未封裝的應用程式。 如需詳細資訊,請參閱 使用 CLI 發佈適用於 Windows 的未封裝 .NET MAUI 應用程式。
手勢辨識器
- PointerGestureRecognizer會取得 PointerPressedCommand、PointerPressedCommandParameter、PointerReleasedCommand、屬性PointerReleasedCommandParameter和 和 PointerReleased PointerPressed 事件。 如需詳細資訊,請參閱 辨識指標手勢。
- PointerEventArgs類別所PointerGestureRecognizer引發之指標事件的物件會取得 PlatformArgs 型PlatformPointerEventArgs別 的屬性。 這個屬性可讓您存取指標手勢事件的平臺特定自變數。 如需詳細資訊,請參閱 辨識指標手勢。
- DragStartingEventArgs伴隨拖放手勢事件的、 DragEventArgsDropEventArgs、 和 DropCompletedEventArgs 物件都會取得
PlatformArgs
屬性。 這個屬性可讓您存取拖放事件的平臺特定自變數。 如需詳細資訊,請參閱 辨識拖放手勢。 - 在 、 DragStartingEventArgs或 DropEventArgs 物件上DragEventArgs呼叫 GetPosition 方法,即可取得拖放手勢的位置。 如需詳細資訊,請參閱 辨識拖放手勢。
- 類別 TapGestureRecognizer 可提升在Android上處理次要點選的能力。 如需詳細資訊,請參閱 辨識點選手勢。
導覽
- 殼層流覽會取得多 GoToAsync 載,可讓您傳遞單一使用導覽數據,在巡覽發生之後清除,做為 ShellNavigationQueryParameters 物件。 如需詳細資訊,請參閱 傳遞單一使用物件型導覽數據。
平台整合
- 類別 Geolocation 可以在應用程式位於前景時接聽位置變更。 如需詳細資訊,請參閱 接聽位置變更。
- FlashlightIsSupportedAsync會取得方法,這個方法會判斷手電筒筒是否可在裝置上使用。 如需詳細資訊,請參閱 手電筒筒筒。
- SensorSpeed 間隔已跨所有平臺整合。 如需詳細資訊,請參閱 存取裝置感測器。
- 類別 Permissions 會取得 Permissions.Bluetooth 許可權,這是尋找藍牙裝置的 Android 12 許可權,讓目前的裝置可供其他藍牙裝置探索,並與已配對的藍牙裝置通訊。 如需詳細資訊,請參閱 權限。
- 類別 Permissions 會取得 Permissions.NearbyWifiDevices 許可權,這是存取附近WiFi裝置的Android13許可權。 如需詳細資訊,請參閱 權限。
XAML
x:ClassModifier
您可以在 XAML 類別上指定 屬性,以控制元件中產生類別的存取層級。 如需詳細資訊,請參閱 類別修飾詞。- 在中 ResourceDictionary 定義的資源也可以使用標記延伸來
AppThemeBinding
取用DynamicResource
。 如需詳細資訊,請參閱 定義和使用主題資源。 - Color
ContentProperty
是 類別的 SolidColorBrush ,因此不需要從 XAML 明確設定。
疑難排解
- 為了進行疑難解答,可以停用資源產生。 如需詳細資訊,請參閱停用影像封裝、停用啟動顯示畫面封裝、停用字型封裝和停用資產檔案封裝。
- 為了進行疑難解答,可以產生空白啟動顯示畫面。 如需詳細資訊,請參閱 產生空白啟動顯示畫面。
- 重設大小器會檢查重複的影像檔名。 如需詳細資訊,請參閱 重複的影像檔名錯誤。
其他
- 視窗管理可以與類別分離
App
。 如需詳細資訊,請參閱 從 App 類別分離視窗管理。 - Android 應用程式中可以輕鬆地取用數種系統字型。 如需詳細資訊,請參閱 取用字型。
- 在 iOS 上,
MauiUIApplicationDelegate
取得PerformFetch
可透過iOSLifecycle.PerformFetch
委派覆寫或取用的方法。 如需詳細資訊,請參閱 iOS 和 Mac Catalyst 平臺生命週期事件。
類型取代和移除
下列類型或成員已被取代:
- ClickGestureRecognizer 已被取代。
AutomationProperties.Name
、AutomationProperties.HelpText
和AutomationProperties.LabeledBy
附加屬性已被取代。- FocusChangeRequested已被取代。 Focus()請改用 方法嘗試將焦點設定在檢視上。
已移除下列型態或成員:
Application.Properties
已移除 屬性和Application.SavePropertiesAsync
方法。 若要將應用程式屬性數據遷移至 .NET MAUI,請參閱 將數據從 Xamarin.Forms 應用程式屬性字典遷移至 .NET MAUI 喜好設定。- 已移除
PhoneDialer.Current
屬性。 請改用PhoneDialer.Default
。 - 已移除
OpenGLView
。
行為變更
下列行為已從上一個版本變更:
- 從 XAML 使用 Map 控制項現在需要下列
xmlns
命名空間宣告:xmlns:maps="http://schemas.microsoft.com/dotnet/2021/maui/maps"
。 - 使用 方法從數據流
ImageSource.FromStream
載入影像時,Android 上會停用影像快取。 這是因為缺少建立合理快取索引鍵的數據。 - 在iOS上,當軟輸入鍵盤涵蓋文字輸入欄位時,頁面會自動捲動,讓欄位位於軟輸入鍵盤上方。
KeyboardAutoManagerScroll.Disconnect
您可以在 命名空間中Microsoft.Maui.Platform
呼叫 方法,以停用此預設行為。KeyboardAutoManagerScroll.Connect
您可以呼叫 方法,在停用之後重新啟用行為。 - 索引標籤的色彩在殼層應用程式中的設定方式在某些平臺上已變更。 如需詳細資訊,請參閱索引標籤外觀。
- 您不需要為
$(ApplicationIdGuid)
應用程式項目檔中的組建屬性指定值。 這是因為 .NET MAUI Windows 應用程式不再需要 GUID 作為應用程式識別碼,而是改用組建屬性的值$(ApplicationId)
作為應用程式識別符。 因此,所有平臺現在都會使用相同的反向網域格式應用程式標識符,例如 com.mycompany.myapp。 - .NET MAUI Mac Catalyst 應用程式不再限於功能表欄上的 50 個功能表項。
- 在
PlatformImage.FromStream
命名空間中Microsoft.Maui.Graphics
,方法現在可以用來在 Windows 上載入影像,而不必使用W2DImageLoadingService
類別。 - 在Android上,動畫會遵守系統動畫設定。 如需詳細資訊,請參閱 基本動畫。
效能
.NET MAUI 8 中有許多效能變更。 這些變更可分為五個區域:
- 新功能
- 建置和內部迴圈效能
- 效能或應用程式大小改善
- 結構及
IEquatable
.NET MAUI 中的 - 修正中的效能問題
{AppThemeBinding}
- 位址
CA1307
和CA1309
效能 CA1311
效能位址- 拿掉 Android 上的未使用
ViewAttachedToWindow
事件 - 拿掉不需要
System.Reflection
的{Binding}
- 用於
StringComparer.Ordinal
Dictionary
和HashSet
- 在 Android 上減少 Java
MauiDrawable
Interop - 改善Android版面配置效能
Label
- 減少 .NET MAUI 中控件的 Java Interop 呼叫
- 改善Android的效能
Entry.MaxLength
- 改善 Windows 上的記憶體使用量
CollectionView
- 在 Apple 平臺上使用
UnmanagedCallersOnlyAttribute
- Android 上字串的 Java Interop 更快
- Android 上 C# 事件的 Java Interop 更快
- 使用 JNI 的函式指標
- 刪除
Xamarin.AndroidX.Legacy.Support.V4
- iOS 和 macOS 上的泛型重複資料刪除
- 修正
System.Linq.Expressions
類似 iOS 的平台實作 - 針對 iOS 和 Catalyst 設定
DynamicCodeSupport=false
- 結構及
- 記憶體流失
- 工具和檔
如需詳細資訊,請參閱 .NET MAUI 中的 .NET 8 效能改進。
從 .NET 7 升級至 .NET 8
若要將專案從 .NET 7 升級至 .NET 8,請使用 Visual Studio 17.8+或獨立安裝程式和 dotnet workload install maui
命令安裝 .NET MAUI 工作負載。
然後,開啟 . csproj 檔案,並將 Target Framework Monikers (TFM) 從 7 變更為 8。 如果您使用 TFM,例如 net7.0-ios13.6
請務必符合平臺版本或完全移除它。 下列範例顯示 .NET 7 專案的 TFM:
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst;net7.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
下列範例顯示 .NET 8 專案的 TFM:
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst;net8.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
針對下列 .NET MAUI NuGet 套件,也應該將明確套件參考新增至 . csproj 檔案:
<ItemGroup>
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
</ItemGroup>
$(MauiVersion)
變數會從您安裝的 .NET MAUI 版本參考。 您可以將組建屬性新增$(MauiVersion)
至 .csproj 檔案,以覆寫此值:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
<UseMaui>True</UseMaui>
<MauiVersion>8.0.3</MauiVersion>
</PropertyGroup>
</Project>
使用夜間摘要的臨機操作組建或從提取要求下載的組建時,這非常有用。
此外,$(ApplicationIdGuid)
您可以從 .NET 8 中的 .csproj 檔案中移除組建屬性。 如需詳細資訊,請參閱 行為變更。
第一次建置升級的應用程式之前,請先刪除 bin
和 obj
資料夾。
注意
.NET 8 中 .NET MAUI 應用程式的專案範本會啟用具有建置屬性之專案的 $(Nullable)
可為 Null 內容。 如需詳細資訊,請參閱 可為 Null。