Share via


在 .NET MAUI 中重複使用自定義轉譯器

Browse sample. 流覽範例

雖然使用 .NET 多平臺應用程式 UI (.NET MAUI) 處理程式來自定義和建立控件有許多優點,但仍可以在 .NET MAUI 應用程式中使用 Xamarin.Forms 自定義轉譯器。 如需自定義轉譯器的詳細資訊,請參閱 Xamarin.Forms 自定義轉譯器

填充轉譯器

.NET MAUI 提供填充轉譯器,可讓您輕鬆地重複使用 Xamarin.Forms 自定義轉譯器,前提是轉譯器衍生自 FrameRendererListViewRendererShellRenderer 在 iOS 和 Android 上, TableViewRenderer以及 VisualElementRenderer

將衍生自 FrameRenderer、、ListViewRendererShellRendererTableViewRendererVisualElementRenderer 的 Xamarin.Forms 自定義轉譯器移轉至 .NET MAUI 填充轉譯器的程式為:

  1. 將自定義轉譯器程式代碼新增至 .NET MAUI 項目的適當位置。 如需詳細資訊,請參閱 新增程序代碼
  2. using修改指示詞並移除ExportRenderer屬性。 如需詳細資訊,請參閱 修改using指示詞和其他程序代碼
  3. 註冊轉譯器。 如需詳細資訊,請參閱 註冊轉譯器
  4. 取用轉譯器。 如需詳細資訊,請參閱 取用自定義轉譯器

若要示範在 .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 資料夾:

Move your renderer files.

如果您的方案每個平臺都有個別的專案,則您應該將平臺特定的實作檔案移至對應的專案。

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

轉譯器會向 ConfigureMauiHandlersAddHandler 方法註冊。 方法的第一個自變數 AddHandler 是跨平臺控件類型,第二個自變數是其轉譯器類型。

重要

只有衍生自 FrameRenderer、、ListViewRendererShellRenderer在iOS和Android上的轉譯器,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>