플랫폼 사양Platform-Specifics

샘플 다운로드 샘플 다운로드Download Sample Download the sample

플랫폼별을 사용 하면 사용자 지정 렌더러 또는 효과 구현 하지 않고도 에서만 특정 플랫폼에서 사용할 수 있는 기능을 사용할 수 있습니다.Platform-specifics allow you to consume functionality that's only available on a specific platform, without implementing custom renderers or effects.

플랫폼별 API는 fluent 코드 또는 XAML을 통해 사용 하기 위한 프로세스는 다음과 같습니다.The process for consuming a platform-specific through XAML, or through the fluent code API is as follows:

  1. 추가 xmlns 선언 또는 using 에 대 한 지시문을 Xamarin.Forms.PlatformConfiguration 네임 스페이스입니다.Add a xmlns declaration or using directive for the Xamarin.Forms.PlatformConfiguration namespace.
  2. 추가 된 xmlns 선언 또는 using 플랫폼별 기능이 포함 된 네임 스페이스에 대 한 지시문:Add a xmlns declaration or using directive for the namespace that contains the platform-specific functionality:
    1. 이 ios의 경우는 Xamarin.Forms.PlatformConfiguration.iOSSpecific 네임 스페이스입니다.On iOS, this is the Xamarin.Forms.PlatformConfiguration.iOSSpecific namespace.
    2. 이 Android에는 Xamarin.Forms.PlatformConfiguration.AndroidSpecific 네임 스페이스입니다.On Android, this is the Xamarin.Forms.PlatformConfiguration.AndroidSpecific namespace. 이것이 Android AppCompat 합니다 Xamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat 네임 스페이스입니다.For Android AppCompat, this is the Xamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat namespace.
    3. 이 유니버설 Windows 플랫폼에는 Xamarin.Forms.PlatformConfiguration.WindowsSpecific 네임 스페이스입니다.On the Universal Windows Platform, this is the Xamarin.Forms.PlatformConfiguration.WindowsSpecific namespace.
  3. XAML, 또는 사용 하 여 코드에서 플랫폼별으로 적용 된 On<T> fluent API.Apply the platform-specific from XAML, or from code with the On<T> fluent API. T 수는 iOS Android , 또는 Windows 에서 형식을 합니다 Xamarin.Forms.PlatformConfiguration 네임 스페이스입니다.The value of T can be the iOS, Android, or Windows types from the Xamarin.Forms.PlatformConfiguration namespace.

참고

참고를 사용할 수 없는 플랫폼에서 플랫폼별을 사용 하는 동안 발생 하지 않을 것임 오류가 발생 합니다.Note that attempting to consume a platform-specific on a platform where it is unavailable will not result in an error. 대신 코드 적용 되 고 플랫폼별 없이 실행 됩니다.Instead, the code will execute without the platform-specific being applied.

통해 사용 된 플랫폼별 합니다 On<T> 유연한 코드 API 반환 IPlatformElementConfiguration 개체입니다.Platform-specifics consumed through the On<T> fluent code API return IPlatformElementConfiguration objects. 이렇게 하면 메서드 연계 된 동일한 개체에서 호출할 여러 플랫폼별 수 있습니다.This allows multiple platform-specifics to be invoked on the same object with method cascading.

Xamarin.ios에서 제공 하는 플랫폼 세부 정보에 대 한 자세한 내용은 IOS 플랫폼관련, Android 플랫폼 세부정보 및 Windows 플랫폼 세부정보를 참조 하세요.For more information about the platform-specifics provided by Xamarin.Forms, see iOS Platform-Specifics, Android Platform-Specifics, and Windows Platform-Specifics.

플랫폼 세부 정보 만들기Creating platform-specifics

공급 업체는 효과를 사용 하 여 고유한 플랫폼 정보를 만들 수 있습니다.Vendors can create their own platform-specifics with Effects. 효과가는 플랫폼별을 통해 노출 되는 특정 기능을 제공 합니다.An Effect provides the specific functionality, which is then exposed through a platform-specific. 결과 코드를 fluent API 및 XAML을 통해 보다 쉽게 사용할 수 있는 효과입니다.The result is an Effect that can be more easily consumed through XAML, and through a fluent code API.

플랫폼 전용을 만들기 위한 프로세스는 다음과 같습니다.The process for creating a platform-specific is as follows:

  1. 효과로 특정 기능을 구현 합니다.Implement the specific functionality as an Effect. 자세한 내용은 효과 만드는합니다.For more information, see Creating an Effect.
  2. 효과 노출 하는 플랫폼 특정 클래스를 만듭니다.Create a platform-specific class that will expose the Effect. 자세한 내용은 플랫폼별 클래스를 만드는합니다.For more information, see Creating a Platform-Specific Class.
  3. 플랫폼별 클래스에서 플랫폼별 XAML을 통해 사용할 수 있도록 연결된 된 속성을 구현 합니다.In the platform-specific class, implement an attached property to allow the platform-specific to be consumed through XAML. 자세한 내용은 연결 된 속성 추가합니다.For more information, see Adding an Attached Property.
  4. 플랫폼 관련 클래스에 플랫폼별 코드를 fluent API 통해 사용할 수 있도록 확장 메서드를 구현 합니다.In the platform-specific class, implement extension methods to allow the platform-specific to be consumed through a fluent code API. 자세한 내용은 확장 메서드 추가합니다.For more information, see Adding Extension Methods.
  5. 효과 플랫폼 특정 효과와 동일한 플랫폼에서 호출 된 경우에 적용 됩니다 있도록 효과 구현을 수정 합니다.Modify the Effect implementation so that the Effect is only applied if the platform-specific has been invoked on the same platform as the Effect. 자세한 내용은 효과 만드는합니다.For more information, see Creating the Effect.

플랫폼 특정 효과 노출 합니다. 결과 XAML 및 fluent 코드 API 통해 효과 보다 쉽게 사용할 수 있습니다.The result of exposing an Effect as a platform-specific is that the Effect can be more easily consumed through XAML and through a fluent code API.

참고

공급 업체 명의 사용 편의성을 위해 자체 플랫폼별을 만들려면이 기술은 사용할지는 예상는 것입니다.It's envisaged that vendors will use this technique to create their own platform-specifics, for ease of consumption by users. 사용자가 자신의 플랫폼별을 만들도록 선택할 수, 하는 동안 유의 만들고 효과 사용 보다 더 많은 코드가 필요 하다는 것입니다.While users may choose to create their own platform-specifics, it should be noted that it requires more code than creating and consuming an Effect.

샘플 응용 프로그램Label 컨트롤 Shadow 에 의해 표시 되는 텍스트에 그림자를 추가 하는 플랫폼별를 보여 줍니다.The sample application demonstrates a Shadow platform-specific that adds a shadow to the text displayed by a Label control:

샘플 응용 프로그램Shadow 이해를 용이 하 게 하기 위해 플랫폼 별로 각 플랫폼을 구현 합니다.The sample application implements the Shadow platform-specific on each platform, for ease of understanding. 그러나 각 플랫폼별 효과 구현 외에도 섀도 클래스의 구현은 각 플랫폼에 대해 거의 동일 합니다.However, aside from each platform-specific Effect implementation, the implementation of the Shadow class is largely identical for each platform. 따라서이 가이드 섀도 클래스와 연결 된 미치는 단일 플랫폼의 구현에 중점을 둡니다.Therefore, this guide focusses on the implementation of the Shadow class and associated Effect on a single platform.

효과 대 한 자세한 내용은 참조 하세요. 효과 사용 하 여 사용자 지정 컨트롤합니다.For more information about Effects, see Customizing Controls with Effects.

플랫폼별 클래스 만들기Creating a platform-specific class

플랫폼 전용으로 생성 됩니다는 public static 클래스:A platform-specific is created as a public static class:

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

다음 섹션에서는 구현에 설명 된 Shadow 플랫폼별 및 관련 된 적용 합니다.The following sections discuss the implementation of the Shadow platform-specific and associated Effect.

연결 된 속성 추가Adding an attached property

연결된 된 속성에 추가 되어야 합니다는 Shadow 플랫폼별 XAML 통해 사용을 허용 하려면:An attached property must be added to the Shadow platform-specific to allow consumption through XAML:

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 클래스에 연결 된.The IsShadowed attached property is used to add the MyCompany.LabelShadowEffect Effect to, and remove it from, the control that the Shadow class is attached to. 이 연결 속성 레지스터는 OnIsShadowedPropertyChanged 속성의 값이 변경 될 때 실행 되는 메서드.This attached property registers the OnIsShadowedPropertyChanged method that will be executed when the value of the property changes. 그러면이 메서드를 호출 합니다는 AttachEffect 또는 DetachEffect 의 값을 기반으로 하는 메서드를 추가 하 여 효과 제거 합니다 IsShadowed 연결 된 속성입니다.In turn, this method calls the AttachEffect or DetachEffect method to add or remove the effect based on the value of the IsShadowed attached property. 효과 컨트롤을 수정 하 여 컨트롤에서 제거 또는 추가할 Effects 컬렉션입니다.The Effect is added to or removed from the control by modifying the control's Effects collection.

참고

그룹 이름 확인 및 적용 구현에 지정 된 고유 식별자를 연결한 값을 지정 하 여 효과 해결는 note 합니다.Note that the Effect is resolved by specifying a value that's a concatenation of the resolution group name and unique identifier that's specified on the Effect implementation. 자세한 내용은 효과 만드는합니다.For more information, see Creating an Effect.

연결 된 속성에 대 한 자세한 내용은 참조 하세요. 연결 속성합니다.For more information about attached properties, see Attached Properties.

확장 메서드를 추가합니다.Adding Extension Methods

확장 메서드를 추가 해야 합니다 Shadow 플랫폼별 코드를 fluent API 통해 사용을 허용 하려면:Extension methods must be added to the Shadow platform-specific to allow consumption through a fluent code API:

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;
        }
        ...
    }
}

IsShadowed 하 고 SetIsShadowed 확장 메서드 호출 get 및 set 접근자에 대 한는 IsShadowed 각각 연결 된 속성입니다.The IsShadowed and SetIsShadowed extension methods invoke the get and set accessors for the IsShadowed attached property, respectively. 각 확장 메서드가 작동 합니다 IPlatformElementConfiguration<iOS, FormsElement> 형식에 플랫폼 전용을 호출할 수 있음을 지정 하는 Label iOS에서 인스턴스.Each extension method operates on the IPlatformElementConfiguration<iOS, FormsElement> type, which specifies that the platform-specific can be invoked on Label instances from iOS.

효과 만들기Creating the effect

Shadow 플랫폼별 추가 MyCompany.LabelShadowEffect Label 를 제거 합니다.The Shadow platform-specific adds the MyCompany.LabelShadowEffect to a Label, and removes it. 다음 코드 예제는 LabelShadowEffect iOS 프로젝트에 대 한 구현 합니다.The following code example shows the LabelShadowEffect implementation for the iOS project:

[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 메서드 집합 Control.Layer 그림자를 만들기 위한 속성을 제공 하는 합니다 IsShadowed 연결된 속성이로 설정 되어 true, 제공 및는 Shadow 플랫폼별 동일한 플랫폼에서 호출 된는 효과 대 한 구현 됩니다.The UpdateShadow method sets Control.Layer properties to create the shadow, provided that the IsShadowed attached property is set to true, and provided that the Shadow platform-specific has been invoked on the same platform that the Effect is implemented for. 이 검사가 수행 되는 OnThisPlatform 메서드.This check is performed with the OnThisPlatform method.

경우는 Shadow.IsShadowed 속성 값이 변경 런타임에 적용 해야 그림자를 제거 하 여 응답을 연결 합니다.If the Shadow.IsShadowed attached property value changes at runtime, the Effect needs to respond by removing the shadow. 따라서 재정의 된 버전의 OnElementPropertyChanged 메서드를 호출 하 여 바인딩 가능한 속성 변경에 대응 되는 UpdateShadow 메서드.Therefore, an overridden version of the OnElementPropertyChanged method is used to respond to the bindable property change by calling the UpdateShadow method.

효과 만드는 방법에 대 한 자세한 내용은 참조 하세요. 효과 만드는 하 고 연결 된 속성으로 결과 매개 변수 전달합니다.For more information about creating an effect, see Creating an Effect and Passing Effect Parameters as Attached Properties.

플랫폼별 사용Consuming the platform-specific

합니다 Shadow 플랫폼별으로 설정 하 여 XAML에서 사용 되는 Shadow.IsShadowed 연결 된 속성을 boolean 값:The Shadow platform-specific is consumed in XAML by setting the Shadow.IsShadowed attached property to a boolean value:

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

또는 fluent API를 사용 하 여 C#에서 사용할 수 있습니다.Alternatively, it can be consumed from C# using the fluent API:

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

...

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