XAML에서 문자열이 아닌 형식을 사용하여 사용자 지정 속성 값을 설정하는 방법 [Xamarin.Forms]

Vlladz

XAML의 Xamarin.Forms에서 다음과 같이 작성할 수 있습니다.

<Entry Keyboard="Plain" />

나는 Entry클래스를 스카우트했고 Keyboard속성은 유형 Xamarin.Forms.Keyboard입니다. 그러나 내 사용자 정의를 만들고 ContentView내부에 다음과 같이 작성하면 :

    public static readonly BindableProperty KeyboardProperty = BindableProperty.Create
    (
        propertyName: "Keyboard",
        returnType: typeof(Keyboard),
        declaringType: typeof(MyCustomContentView),
        defaultValue: Keyboard.Default,
        defaultBindingMode: BindingMode.TwoWay,
        propertyChanged: (bindable, oldValue, newValue) =>
        {
            // some unrelated stuff here
        }
    );
    public Keyboard Keyboard
    {
        get => (Keyboard)GetValue(KeyboardProperty);
        set => SetValue(KeyboardProperty, value);
    }

내 콘텐츠보기에 동일한 XAML 형식을 사용할 수 없습니다. 분명히 그것은 Xamarin.Forms.Keyboard클래스 의 인스턴스를 기대하는 간단한 문자열 입니다. 지금까지 나는 그것이 KeyboardProperty또는 바인딩 과 관련이 없다는 것을 알아 냈습니다 .하지만 Keyboard속성 자체 (내가 맞다면). 나는 그것을 함께 할 수있는 뭔가가 생각 ValueConverters난 XAML 파서가이 부분에 도달 할 때 키보드 변환 문자열의 형태를 정의 할 필요가 있다고, 그냥 내가 무엇을해야하는지 답을 찾을 수 없습니다.

Deczaloth

귀하의 질문에 대한 대답은 Petzold가 Xamarin.Forms 에 대한 그의 아름다운 책에서 잘 설명합니다 ( 여기 에서 무료로 다운로드 할 수 있습니다 !).

7 장의 속성 및 속성 섹션 끝 에서 읽을 수 있습니다.

... XAML에 사용자 지정 클래스를 포함 할 수 있으며 이러한 클래스는 사용자 지정 형식의 속성을 가질 수 있거나 속성이 표준 형식 일 수 있지만 추가 값을 허용 할 수 있습니다. 필요한 것은 C # TypeConverter 특성으로 이러한 유형 또는 속성에 플래그를 지정하고 TypeConverter에서 파생되는 클래스를 제공하는 것뿐입니다.

그리고 호기심에 대한 몇 가지 세부 사항

(앞서 언급 한 책에서 간단히 인용)

그 장에서 Petzold는 레이블이있는 예제를 통해이를 설명합니다.

<Label Text="Hello from XAML!"        
       IsVisible="True"
       Opacity="0.75" 
       HorizontalTextAlignment="Center" 
       VerticalOptions="CenterAndExpand" 
       TextColor="Blue" 
       BackgroundColor="#FF8080" 
       FontSize="Large" 
       FontAttributes="Bold,Italic" /> 

그런 다음 XAML로 이러한 속성을 설정하는 방법을 설명합니다.

XAML의 간결함은 대부분 특성 값의 간결함 (예 : Device.GetNamedSize 메서드 호출이 아닌 "Large"라는 단어 사용)에서 비롯됩니다. 이러한 약어는 XAML 파서에 내장되지 않습니다. 대신 XAML 파서는이 목적을 위해 특별히 정의 된 다양한 변환기 클래스의 지원을받습니다.

XAML 파서가 Label 요소를 발견하면 리플렉션을 사용하여 Xamarin.Forms에 Label이라는 클래스가 있는지 여부를 확인할 수 있으며,있는 경우 해당 클래스를 인스턴스화 할 수 있습니다. 이제 해당 개체를 초기화 할 준비가되었습니다. Text 속성은 문자열 유형이며 속성 값은 단순히 해당 속성에 할당됩니다.

Label의 IsVisible 및 Opacity 속성은 각각 bool 및 double 유형이며 예상대로 간단합니다. XAML 파서는 Boolean.Parse 및 Double.Parse 메서드를 사용하여 특성 값을 변환합니다. Boolean.Parse 메서드는 대 / 소문자를 구분하지 않지만 일반적으로 부울 값은 XAML에서 "True"및 "False"로 대문자로 표시됩니다. Double.Parse 메서드에는 CultureInfo.InvariantCulture 인수가 전달되므로 변환은 프로그래머 또는 사용자의 로컬 문화에 의존하지 않습니다.

Label의 HorizontalTextAlignment 속성은 열거 형인 TextAlignment 유형입니다. 열거 유형 인 모든 속성에 대해 XAML 파서는 Enum.Parse 메서드를 사용하여 문자열에서 값으로 변환합니다.

VerticalOptions 속성은 구조 인 LayoutOptions 유형입니다. XAML 파서가 리플렉션을 사용하여 LayoutOptions 구조를 참조하면 구조에 C # 특성이 정의되어 있음을 발견합니다.

[TypeConverter (typeof(LayoutOptionsConverter))] 
public struct LayoutOptions 
{ 
}

TypeConverter 특성은 TypeConverterAttribute라는 클래스에서 지원됩니다. LayoutOptions의이 특정 TypeConverter 특성은 CanConvertFrom 및 ConvertFrom이라는 메서드를 정의하는 TypeConverter라는 공용 추상 클래스에서 파생되는 LayoutOptionsConverter라는 클래스를 참조합니다. XAML 파서가이 TypeConverter 특성을 발견하면 LayoutOptionsConverter를 인스턴스화합니다. XAML의 VerticalOptions 특성에는 "Center"문자열이 할당되므로 XAML 파서는 해당 "Center"문자열을 LayoutOptionsConverter의 ConvertFrom 메서드에 전달하고 LayoutOptions 값을 출력합니다. 이것은 Label 개체의 VerticalOptions 속성에 할당됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관