다음을 통해 공유


플랫폼 사양

플랫폼 관련 기능을 사용하면 사용자 지정 렌더러 또는 효과를 구현하지 않고 특정 플랫폼에서만 사용할 수 있는 기능을 사용할 수 있습니다.

XAML 또는 흐름 코드 API를 통해 플랫폼별을 사용하는 프로세스는 다음과 같습니다.

  1. 네임스페이스에 xmlns 대한 Xamarin.Forms.PlatformConfiguration 선언 또는 using 지시문을 추가합니다.
  2. xmlns 플랫폼별 기능을 포함하는 네임스페이스에 대한 선언 또는 using 지시문을 추가합니다.
    1. iOS에서 네임스페이 Xamarin.Forms.PlatformConfiguration.iOSSpecific 스입니다.
    2. Android에서 네임스페이 Xamarin.Forms.PlatformConfiguration.AndroidSpecific 스입니다. Android AppCompat의 경우 네임스페이 Xamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat 스입니다.
    3. 유니버설 Windows 플랫폼 네임스페이 Xamarin.Forms.PlatformConfiguration.WindowsSpecific 스입니다.
  3. XAML 또는 흐름 API를 사용하여 On<T> 코드에서 플랫폼별을 적용합니다. 값은 네임스페이iOSAndroid스의 T 형식 또는 Windows 형식 Xamarin.Forms.PlatformConfiguration 일 수 있습니다.

참고 항목

사용할 수 없는 플랫폼에서 플랫폼별을 사용하려고 하면 오류가 발생하지 않습니다. 대신 플랫폼별 코드가 적용되지 않고 실행됩니다.

흐름 코드 API 반환 IPlatformElementConfiguration 개체를 On<T> 통해 사용되는 플랫폼 관련 개체입니다. 이렇게 하면 메서드 연계를 사용하여 동일한 개체에서 여러 플랫폼 관련 항목이 호출될 수 있습니다.

제공된 Xamarin.Forms플랫폼 관련 사항에 대한 자세한 내용은 iOS 플랫폼 관련, Android 플랫폼 관련 항목Windows 플랫폼 관련 정보를 참조하세요.

플랫폼별 만들기

공급업체는 효과를 사용하여 고유한 플랫폼 관련 정보를 만들 수 있습니다. 효과는 특정 기능을 제공하며 플랫폼별 기능을 통해 노출됩니다. 그 결과 XAML 및 흐름 코드 API를 통해 더 쉽게 사용할 수 있는 효과가 생성됩니다.

플랫폼별 만들기 프로세스는 다음과 같습니다.

  1. 특정 기능을 효과로 구현합니다. 자세한 내용은 효과 만들기를 참조 하세요.
  2. 효과를 노출하는 플랫폼별 클래스를 만듭니다. 자세한 내용은 플랫폼별 클래스 만들기를 참조 하세요.
  3. 플랫폼별 클래스에서 연결된 속성을 구현하여 XAML을 통해 플랫폼별 속성을 사용할 수 있도록 합니다. 자세한 내용은 연결된 속성 추가를 참조 하세요.
  4. 플랫폼별 클래스에서 플랫폼별 확장 메서드를 구현하여 흐름 코드 API를 통해 플랫폼별 메서드를 사용할 수 있도록 합니다. 자세한 내용은 확장 메서드 추가를 참조 하세요.
  5. 효과와 동일한 플랫폼에서 플랫폼별로 호출된 경우에만 효과가 적용되도록 효과 구현을 수정합니다. 자세한 내용은 효과 만들기를 참조 하세요.

효과를 플랫폼별 효과로 노출한 결과는 XAML 및 흐름 코드 API를 통해 효과를 더 쉽게 사용할 수 있다는 것입니다.

참고 항목

공급업체는 이 기술을 사용하여 사용자가 쉽게 사용할 수 있도록 고유한 플랫폼 관련 정보를 만들 것으로 계획되었습니다. 사용자가 고유한 플랫폼 관련 항목을 만들도록 선택할 수 있지만 효과를 만들고 사용하는 것보다 더 많은 코드가 필요하다는 점에 유의해야 합니다.

샘플 애플리케이션은 컨트롤이 Shadow 표시하는 Label 텍스트에 그림자를 추가하는 플랫폼별 방법을 보여 줍니다.

섀도 플랫폼별

샘플 애플리케이션은 이해하기 쉽게 각 플랫폼에서 플랫폼별 구현 Shadow 을 수행합니다. 그러나 각 플랫폼별 효과 구현 외에도 Shadow 클래스의 구현은 각 플랫폼에 대해 거의 동일합니다. 따라서 이 가이드에서는 단일 플랫폼에서 섀도 클래스 및 관련 효과의 구현에 초점을 맞춥니다.

효과에 대한 자세한 내용은 효과를 사용하여 컨트롤 사용자 지정을 참조 하세요.

플랫폼별 클래스 만들기

플랫폼별 클래스로 public static 생성됩니다.

namespace MyCompany.Forms.PlatformConfiguration.iOS
{
  public static Shadow
  {
    ...
  }
}

다음 섹션에서는 플랫폼별 및 관련 효과의 Shadow 구현에 대해 설명합니다.

연결된 속성 추가

XAML을 통한 사용을 허용하려면 Shadow 연결된 속성을 플랫폼별 속성에 추가해야 합니다.

namespace MyCompany.Forms.PlatformConfiguration.iOS
{
    using System.Linq;
    using Xamarin.Forms;
    using Xamarin.Forms.PlatformConfiguration;
    using FormsElement = Xamarin.Forms.Label;

    public static class Shadow
    {
        const string EffectName = "MyCompany.LabelShadowEffect";

        public static readonly BindableProperty IsShadowedProperty =
            BindableProperty.CreateAttached("IsShadowed",
                                            typeof(bool),
                                            typeof(Shadow),
                                            false,
                                            propertyChanged: OnIsShadowedPropertyChanged);

        public static bool GetIsShadowed(BindableObject element)
        {
            return (bool)element.GetValue(IsShadowedProperty);
        }

        public static void SetIsShadowed(BindableObject element, bool value)
        {
            element.SetValue(IsShadowedProperty, value);
        }

        ...

        static void OnIsShadowedPropertyChanged(BindableObject element, object oldValue, object newValue)
        {
            if ((bool)newValue)
            {
                AttachEffect(element as FormsElement);
            }
            else
            {
                DetachEffect(element as FormsElement);
            }
        }

        static void AttachEffect(FormsElement element)
        {
            IElementController controller = element;
            if (controller == null || controller.EffectIsAttached(EffectName))
            {
                return;
            }
            element.Effects.Add(Effect.Resolve(EffectName));
        }

        static void DetachEffect(FormsElement element)
        {
            IElementController controller = element;
            if (controller == null || !controller.EffectIsAttached(EffectName))
            {
                return;
            }

            var toRemove = element.Effects.FirstOrDefault(e => e.ResolveId == Effect.Resolve(EffectName).ResolveId);
            if (toRemove != null)
            {
                element.Effects.Remove(toRemove);
            }
        }
    }
}

IsShadowed 연결된 속성은 클래스가 MyCompany.LabelShadowEffect 연결된 컨트롤 Shadow 에 효과를 추가하고 제거할 때 사용됩니다. 이 연결된 속성은 속성 값이 변경될 때 실행할 OnIsShadowedPropertyChanged 메서드를 등록합니다. 따라서 이 메서드는 연결된 속성의 AttachEffect IsShadowed 값에 따라 효과를 추가하거나 제거하는 메서드를 DetachEffect 호출합니다. 컨트롤의 Effects 컬렉션을 수정하여 효과를 컨트롤에 추가하거나 컨트롤에서 제거합니다.

참고 항목

효과 구현에 지정된 확인 그룹 이름과 고유 식별자의 연결 값을 지정하여 효과를 확인합니다. 자세한 내용은 효과 만들기를 참조 하세요.

연결된 속성에 대한 자세한 내용은 연결된 속성를 참조하세요.

확장 메서드 추가

흐름 코드 API를 Shadow 통해 사용할 수 있도록 플랫폼별 확장 메서드를 추가해야 합니다.

namespace MyCompany.Forms.PlatformConfiguration.iOS
{
    using System.Linq;
    using Xamarin.Forms;
    using Xamarin.Forms.PlatformConfiguration;
    using FormsElement = Xamarin.Forms.Label;

    public static class Shadow
    {
        ...
        public static bool IsShadowed(this IPlatformElementConfiguration<iOS, FormsElement> config)
        {
            return GetIsShadowed(config.Element);
        }

        public static IPlatformElementConfiguration<iOS, FormsElement> SetIsShadowed(this IPlatformElementConfiguration<iOS, FormsElement> config, bool value)
        {
            SetIsShadowed(config.Element, value);
            return config;
        }
        ...
    }
}

SetIsShadowed 확장 메서드는 IsShadowed 연결된 속성에 대한 IsShadowed get 및 set 접근자를 각각 호출합니다. 각 확장 메서드는 iOS의 IPlatformElementConfiguration<iOS, FormsElement> 인스턴스에서 플랫폼별 호출할 수 있도록 지정하는 형식에서 Label 작동합니다.

효과 만들기

플랫폼별 MyCompany.LabelShadowEffectShadow 이를 추가한 다음 Label제거합니다. 다음 코드 예제는 iOS 프로젝트에 대한 LabelShadowEffect 구현을 보여줍니다.

[assembly: ResolutionGroupName("MyCompany")]
[assembly: ExportEffect(typeof(LabelShadowEffect), "LabelShadowEffect")]
namespace ShadowPlatformSpecific.iOS
{
    public class LabelShadowEffect : PlatformEffect
    {
        protected override void OnAttached()
        {
            UpdateShadow();
        }

        protected override void OnDetached()
        {
        }

        protected override void OnElementPropertyChanged(PropertyChangedEventArgs args)
        {
            base.OnElementPropertyChanged(args);

            if (args.PropertyName == Shadow.IsShadowedProperty.PropertyName)
            {
                UpdateShadow();
            }
        }

        void UpdateShadow()
        {
            try
            {
                if (((Label)Element).OnThisPlatform().IsShadowed())
                {
                    Control.Layer.CornerRadius = 5;
                    Control.Layer.ShadowColor = UIColor.Black.CGColor;
                    Control.Layer.ShadowOffset = new CGSize(5, 5);
                    Control.Layer.ShadowOpacity = 1.0f;
                }
                else if (!((Label)Element).OnThisPlatform().IsShadowed())
                {
                    Control.Layer.ShadowOpacity = 0;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message);
            }
        }
    }
}

메서드는 UpdateShadow 연결된 속성이 IsShadowed 설정된 경우 그림자를 만드는 속성을 true설정하고Control.Layer, Shadow 효과 구현과 동일한 플랫폼에서 플랫폼별 속성이 호출된 경우를 제공합니다. 이 검사는 메서드를 사용하여 수행됩니다 OnThisPlatform .

런타임에 Shadow.IsShadowed 연결된 속성 값이 변경되면 그림자를 제거하여 효과에 응답해야 합니다. 따라서 재정의 OnElementPropertyChanged 된 버전의 메서드는 메서드를 호출 UpdateShadow 하여 바인딩 가능한 속성 변경에 응답하는 데 사용됩니다.

효과를 만드는 방법에 대한 자세한 내용은 효과 만들기 및 효과 매개 변수를 연결된 속성으로 전달을 참조하세요.

플랫폼별 사용

플랫폼별은 Shadow 연결된 속성을 boolean 값으로 설정 Shadow.IsShadowed 하여 XAML에서 사용합니다.

<ContentPage xmlns:ios="clr-namespace:MyCompany.Forms.PlatformConfiguration.iOS" ...>
  ...
  <Label Text="Label Shadow Effect" ios:Shadow.IsShadowed="true" ... />
  ...
</ContentPage>

또는 흐름 API를 사용하여 C#에서 사용할 수 있습니다.

using Xamarin.Forms.PlatformConfiguration;
using MyCompany.Forms.PlatformConfiguration.iOS;

...

shadowLabel.On<iOS>().SetIsShadowed(true);