Aracılığıyla paylaş


.NET MAUI'de efektleri yeniden kullanma

Denetimleri özelleştirmek için .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) işleyicilerini kullanmanın birçok avantajı olsa da, .NET MAUI uygulamalarında Xamarin.Forms efektlerini kullanmak mümkündür. Efektler hakkında daha fazla bilgi için bkz . Xamarin.Forms efektleri.

Xamarin.Forms efektini .NET MAUI'ye geçirme işlemi şu şekildedir:

  1. Efekt sınıflarınızdan efekt özniteliklerini kaldırın. Daha fazla bilgi için bkz . Efekt özniteliklerini kaldırma.
  2. Efekt using yönergelerini kaldırın. Daha fazla bilgi için bkz . Using yönergelerini kaldırma.
  3. Efekt kodunu .NET MAUI uygulama projenizde uygun konuma ekleyin. Daha fazla bilgi için bkz . Efekt kodunu ekleme.
  4. Efekti kaydedin. Daha fazla bilgi için bkz . Efekti kaydetme.
  5. .NET MAUI efektinizi kullanma. Daha fazla bilgi için bkz . Efekti kullanma.

Efekt özniteliklerini kaldırma

Tüm ResolutionGroupNameAttribute ve ExportEffectAttribute öznitelikleri efekt sınıflarınızdan kaldırılmalıdır.

Using yönergelerini kaldırma

ve Xamarin.Forms.Platform.* ad alanlarına yapılan Xamarin.Forms tüm başvurular efekt sınıflarınızdan kaldırılmalıdır.

Efekt kodunu ekleme

.NET MAUI çok hedefli bir proje kullanıyorsanız efekt kodunuz tek bir dosyada birleştirilmeli ve Platformlar klasörünün dışına yerleştirilmelidir. Bu, uygulama ve PlatformEffect uygulamalarınızı platform kodu çevresinde koşullu derleme kullanarak tek bir dosyada birleştirmenizi RoutingEffect gerektirir. Ancak çözümünüzde platform başına ayrı projeler varsa platforma özgü efekt dosyalarını ilgili projelere taşımanız gerekir.

.NET MAUI'de RoutingEffect sınıfı ad alanındadır Microsoft.Maui.Controls . Bu ad alanı .NET MAUI'nin örtük global using yönergelerinden biridir ve bu nedenle bunun için bir using yönerge eklemeniz gerekmez. Ancak, PlatformEffect sınıfı ad alanındadır Microsoft.Maui.Controls.Platform ve bunun için bir using yönerge eklemeniz gerekir.

Aşağıdaki kod örneği, tek bir dosyada birleştirilmiş bir FocusRoutingEffect sınıfı ve platform uygulamalarını gösterir:

using Microsoft.Maui.Controls.Platform;

namespace MyMauiApp.Effects;

internal class FocusRoutingEffect : RoutingEffect
{
}

#if ANDROID
internal class FocusPlatformEffect : PlatformEffect
{
    protected override void OnAttached()
    {
        // Customize the control here
    }

    protected override void OnDetached()
    {
        // Cleanup the control customization here
    }
}
#elif IOS
internal class FocusPlatformEffect : PlatformEffect
{
    protected override void OnAttached()
    {
        // Customize the control here
    }

    protected override void OnDetached()
    {
        // Cleanup the control customization here
    }
}
#elif WINDOWS
internal class FocusPlatformEffect : PlatformEffect
{
    protected override void OnAttached()
    {
        // Customize the control here
    }

    protected override void OnDetached()
    {
        // Cleanup the control customization here
    }
}
#endif

Efekti kaydetme

.NET MAUI uygulama projenizde MauiProgram.cs açın ve yöntemindeki MauiAppBuilder nesnede yöntemini çağırın ConfigureEffectsCreateMauiApp:

public static MauiApp CreateMauiApp()
{
  var builder = MauiApp.CreateBuilder();
  builder
    .UseMauiApp<App>()
    .ConfigureEffects(effects =>
    {
      effects.Add<FocusRoutingEffect, FocusPlatformEffect>();
    });

  return builder.Build();
}

etkisi, uygulamasına ConfigureEffects karşı uygulamayı kaydeden configureDelegatePlatformEffect yöntemiyle RoutingEffect kaydedilir.

Efekti kullanma

Etki, bir denetim koleksiyonuna eklenerek Effects bir .NET MAUI uygulamasında kullanılabilir:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MyMauiApp.Effects"
             x:Class="MyMauiApp.MainPage">
    <VerticalStackLayout>
        <Entry Text="Enter your text">
            <Entry.Effects>
                <local:FocusRoutingEffect />
            </Entry.Effects>
        </Entry>
    </VerticalStackLayout>
</ContentPage>