在 .NET MAUI 中重複使用自定義轉譯器
雖然使用 .NET 多平臺應用程式 UI (.NET MAUI) 處理程式來自定義和建立控件有許多優點,但仍可以在 .NET MAUI 應用程式中使用 Xamarin.Forms 自定義轉譯器。 如需自定義轉譯器的詳細資訊,請參閱 Xamarin.Forms 自定義轉譯器。
填充轉譯器
.NET MAUI 提供填充轉譯器,可讓您輕鬆地重複使用 Xamarin.Forms 自定義轉譯器,前提是轉譯器衍生自 FrameRenderer
、 ListViewRenderer
、 ShellRenderer
在 iOS 和 Android 上, TableViewRenderer
以及 VisualElementRenderer
。
將衍生自 FrameRenderer
、、ListViewRenderer
、 ShellRenderer
TableViewRenderer
和 VisualElementRenderer
的 Xamarin.Forms 自定義轉譯器移轉至 .NET MAUI 填充轉譯器的程式為:
- 將自定義轉譯器程式代碼新增至 .NET MAUI 項目的適當位置。 如需詳細資訊,請參閱 新增程序代碼。
using
修改指示詞並移除ExportRenderer
屬性。 如需詳細資訊,請參閱 修改using指示詞和其他程序代碼。- 註冊轉譯器。 如需詳細資訊,請參閱 註冊轉譯器。
- 取用轉譯器。 如需詳細資訊,請參閱 取用自定義轉譯器。
若要示範在 .NET MAUI 中使用自定義轉譯器,請考慮名為 PressableView
的 Xamarin.Forms 控制件。 此控件會 Pressed
根據平臺特定手勢公開和 Released
事件。 自定義轉譯器實作是由 3 個檔案所組成:
PressableView.cs
- 擴充 的ContentView
跨平台類別。PressableViewRenderer.cs
- 衍生自VisualElementRenderer
的Android實作。PressableViewRenderer.cs
- 衍生自VisualElementRenderer
的 iOS 實作。
注意
若要在 .NET MAUI 中使用 Xamarin.Forms 自定義轉譯器,替代方式是將自定義轉譯器移轉至 .NET MAUI 處理程式。 如需詳細資訊,請參閱 將 Xamarin.Forms 自定義轉譯器移轉至 .NET MAUI 處理程式。
新增程式碼
如果您使用 .NET MAUI 多目標專案,跨平臺檔案可以移至 [平臺] 資料夾以外的任何位置,而平臺特定的實作檔案應該移至對應的 Platform 資料夾:
如果您的方案每個平臺都有個別的專案,則您應該將平臺特定的實作檔案移至對應的專案。
修改using指示詞和其他程序代碼
需要移除命名空間的任何參考 Xamarin.Forms.*
,然後您可以將相關類型解析為 Microsoft.Maui.*
。 這必須發生在您已新增至 .NET MAUI 專案的所有檔案中。
您也應該移除任何 ExportRenderer
屬性,因為 .NET MAUI 中不需要這些屬性。 例如,應該移除下列專案:
[assembly: ExportRenderer(typeof(PressableView), typeof(PressableViewRenderer))]
註冊轉譯器
跨平臺控件及其轉譯器必須先向應用程式註冊,才能取用。 這應該發生在 CreateMauiApp
應用程式項目中 類別的 MauiProgram
方法中,這是應用程式的跨平臺進入點:
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
})
.ConfigureMauiHandlers((handlers) =>
{
#if ANDROID
handlers.AddHandler(typeof(PressableView), typeof(XamarinCustomRenderer.Droid.Renderers.PressableViewRenderer));
#elif IOS
handlers.AddHandler(typeof(PressableView), typeof(XamarinCustomRenderer.iOS.Renderers.PressableViewRenderer));
#endif
});
return builder.Build();
}
}
轉譯器會向 ConfigureMauiHandlers 和 AddHandler 方法註冊。 方法的第一個自變數 AddHandler 是跨平臺控件類型,第二個自變數是其轉譯器類型。
重要
只有衍生自 FrameRenderer
、、 NavigationRenderer
ListViewRenderer
在 iOS、 ShellRenderer
iOS 和 AndroidTabbedRenderer
、iOS、TableViewRenderer
、 和 上的轉譯器,而且VisualElementRenderer
可以使用 方法註冊AddHandler。
取用自定義轉譯器
自訂轉譯器可以在 .NET MAUI 應用程式中以自定義控制項的形式取用:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:XamarinCustomRenderer.Controls"
x:Class="MauiCustomRenderer.MainPage">
<Grid BackgroundColor="#f1f1f1">
<controls:PressableView Pressed="Handle_Pressed"
Released="Handle_Released"
HorizontalOptions="Center"
VerticalOptions="Center">
<Grid BackgroundColor="#202020"
HorizontalOptions="Center"
VerticalOptions="Center">
<Label Text="Press Me"
FontSize="16"
TextColor="White"
Margin="24,20"
HorizontalTextAlignment="Center" />
</Grid>
</controls:PressableView>
</Grid>
</ContentPage>