Невозможно сослаться на пользовательский эффект Xamarin PlatformEffect в XAML - PullRequest
0 голосов
/ 05 августа 2020

==== РЕШЕНИЕ ==== Ответ Джо был точным, и я смог заставить это работать, используя его совет. Мне просто нужно было добавить эффект в свой код, и он сработал.

Используя информацию, найденную на net, я создал PlatformEffect для iOS, который можно назначить любому элементу. Он регулирует вид, чтобы учесть iPhone выемку, если она есть.

Моя проблема в том, что я не могу сослаться на эффект платформы в моем XAML.

Теоретически, учитывая код внизу этого сообщения я могу использовать следующее, чтобы применить эффект:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"                 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             x:Class="Enterprise.View.Features.Authentication.LoginView"                 
             xmlns:effect="clr-namespace:Enterprise.iOS.Effects">        
    <Grid>                      
        <Grid.RowDefinitions>               
            <RowDefinition Height="100"/>                
            <RowDefinition Height="*" />            
        </Grid.RowDefinitions>            
        <ContentView BackgroundColor="Green">                
            <ContentView.Effects>                    
                <effect:SafeAreaPaddingEffect />                
            </ContentView.Effects>                
            <Label Text="Hello, from XamarinHelp.com" />            
        </ContentView>                    
    </Grid>
</ContentPage>

Однако ссылка effect не может быть разрешена в объявлении ContentPage. Я, наверное, что-то не так делаю, но не уверен, что это такое. Я не нашел ничего, что отвечало бы на мой вопрос.

Есть мысли? Вот файл PlatformEffect (находится в папке Effects в решении iOS):

using Enterprise.iOS.Effects;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ResolutionGroupName("Enterprise.iOS")]
[assembly: ExportEffect(typeof(SafeAreaPaddingEffect), nameof(SafeAreaPaddingEffect))]
namespace Enterprise.iOS.Effects
{
    public class SafeAreaPaddingEffect : PlatformEffect
    {
        Thickness _padding;

        protected override void OnAttached()
        {
            if (Element is Layout element)
            {
                if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
                {
                    _padding = element.Padding;
                    var insets =
                        UIApplication.SharedApplication.Windows[0].SafeAreaInsets; // Can't use KeyWindow this early
                    if (insets.Top > 0) // We have a notch
                    {
                        element.Padding = new Thickness(_padding.Left + insets.Left, _padding.Top + insets.Top,
                            _padding.Right + insets.Right, _padding.Bottom);
                        return;
                    }
                }

                // Uses a default Padding of 20. Could use an property to modify if you wanted.
                element.Padding = new Thickness(_padding.Left, _padding.Top + 20, _padding.Right, _padding.Bottom);
            }
        }

        protected override void OnDetached()
        {
            if (Element is Layout element)
            {
                element.Padding = _padding;
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 27 августа 2020

Я смог исправить это, назначив эффект в коде позади. Таким образом, соответствующий XAML не выглядит следующим образом

<ContentView BackgroundColor="Green">                
    <Label x:Name="HelloLabel" Text="Hello, from XamarinHelp.com" />            
</ContentView>                    

, и в моем коде позади я добавил следующее сразу после инициализации компонента

HelloLabel.Effects.Add(Effect.Resolve("Enterprise.iOS.Effects.SafeAreaPaddingEffect"));
0 голосов
/ 05 августа 2020

Для реализации эффекта для использования в проекте XAML Xamarin Forms могут быть определены следующие классы:

MyEffects.EffectIds (пространство имен MyEffects, имя класса EffectIds), расположенное в Xamarin Forms или проекте Netstandard (например, MyProject) для определения идентификатора Эффекта.

MyEffects.MyEffect (пространство имен MyEffects, имя класса MyEffect), расположенное в проекте Xamarin Forms или проект Netstandard (например, MyProject) для определения эффекта Xamarin Forms.

MyEffects.iOS.MyEffect (пространство имен MyEffects.iOS, имя класса MyEffect), расположенный в проекте iOS для реализации iOS эффект.

Пример MyEffects.EffectIds:

using Xamarin.Forms;

[assembly: ResolutionGroupName(MyEffects.EffectIds.GroupName)]

namespace MyEffects
{
  public class EffectIds
  {
    public const string GroupName = "MyEffects";

    public static string MyEffect => typeof(MyEffect).FullName;

    //another effect not defined here
    public static string MyOtherEffect => typeof(MyOtherEffect).FullName;
    ...

Пример MyEffects.MyEffect:

using Xamarin.Forms;

namespace MyEffects
{
  public class MyEffect : RoutingEffect
  {
    public MyEffect() : base(EffectIds.MyEffect) { }
  }
}

Пример MyEffects.iOS.MyEffect:

using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

using PlatformEffects = MyEffects.iOS; 
using RoutingEffects = MyEffects; 

[assembly: ExportEffect(typeof(PlatformEffects.MyEffect), nameof(RoutingEffects.MyEffect))] 
namespace MyEffects.iOS 
{ 
  public class MyEffect : PlatformEffect 
  { 
    protected override void OnAttached() 
    { 
      ...

Пример использования в XAML:

<ContentPage

  xmlns:effects="clr-namespace:MyEffects;assembly=MyProject"
  ...
<Entry ... >

  <Entry.Effects>
    <effects:MyEffect />
  </Entry.Effects>

</Entry>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...