2017-12-19 15 views
0

Xamarin Forms (버전 2.5.0.121934)를 사용하여 Android, iOS 및 UWP를 타겟팅하는 앱에서 작업하고 있습니다. 사용자 정의 렌더러가 필요한 일부 텍스트에 밑줄과 취소 선을 추가해야합니다. Android 및 iOS의 경우 모든 것이 정상적으로 작동하며 UWP에서는 취소 선 또는 밑줄을 올바르게 적용했지만 해당 장식을 제거하지 않아도 작동하지 않습니다.Xamarin Forms UWP 앱에서 TextDecoration을 지울 수 없습니다.

[assembly: ExportRenderer(typeof(EnhancedLabel), typeof(EnhancedLabelRenderer))] 
namespace myApp.UWP 
{ 
    public class EnhancedLabelRenderer : LabelRenderer 
    { 
     protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      base.OnElementPropertyChanged(sender, e); 

      var strikethrough = ((EnhancedLabel)sender).Strikethrough; 
      var underline = ((EnhancedLabel)sender).Underline; 

      if (strikethrough && underline) 
      { 
       Control.TextDecorations = TextDecorations.Strikethrough | TextDecorations.Underline; 
      } 
      else if (strikethrough) 
      { 
       Control.TextDecorations = TextDecorations.Strikethrough; 
      } 
      else if (underline) 
      { 
       Control.TextDecorations = TextDecorations.Underline; 
      } 
      else 
      { 
       Control.TextDecorations = TextDecorations.None; 
      } 
     } 
    } 
} 

EnhancedLabelXamarin.Forms.Label을 연장 취소 또는 밑줄 지정 간단한 BindableProperty 필드를 추가하는 간단한 클래스이다

여기에 UWP 렌더러의 전체이다.

렌더러가 올바르게 TextDecorations.None으로 설정되어 있지만 UI에 영향을 미치지 않습니다. 디버거에서이 작업을 수행했으며 실제로 ExtendedLabel 내의 TextBlock의 상태는 TextDecorations.None이지만 UI는 여전히 밑줄을 긋거나 취소 선으로 그립니다. (본질적으로 그 중 하나를 추가 할 수는 있지만 둘 다 할 수 없습니다. 제거하십시오).

저는 Xamarin 문서를 읽고 Bugzilla의 버그를 살펴본 결과 아무런 단서도 발견하지 못했습니다. 다른 사람이이 문제를 겪었습니까? UWP 관련 전화가 있는지 궁금해서 제가 놓친 것을 만들거나 TextDecorations을 사용하여 스타일을 적용하는 잘못된 방법이거나 실제로 버그를 발견 한 것입니다.

+0

친구가 다음과 같이 지적했습니다. https://stackoverflow.com/questions/16480344/programatically-removing-strikethrough-textdecoration-from-code-behind-in-wpf; WPF에서 작동했던 것은 UWP에는 적용되지 않습니다. – Ickster

답변

1

내가 놓친 할 필요가 UWP-특정 호출이 있는지 궁금하거나 TextDecorations를 사용하여 스타일을 적용 할 수있는 길을 잘못 경우, 또는 실제로 버그를 우연히 발견 한 경우. 당신이 요 TextDecorations 사용하려는 경우

, 당신은 다음과 같은 장식 텍스트를 팩에 Run 인스턴스를 사용할 수 있습니다.

Underline ul = new Underline(); 
ul.TextDecorations = TextDecorations.Strikethrough; 
Run r = new Run(); 
r.Text = "Here is an underlined text"; 
ul.Inlines.Add(r); 
MyTextBlock.Inlines.Add(ul); 

요구 사항에 따라 직접 사용할 수있는 맞춤 라벨을 만들었습니다.

CustomLabel.cs

public class CustomLabel : Label 
{ 
    public static readonly BindableProperty DeckProperty = BindableProperty.Create(
    propertyName: "Deck", 
    returnType: typeof(TextDeck), 
    declaringType: typeof(CustomLabel), 
    defaultValue: default(TextDeck)); 
    public TextDeck Deck 
    { 
     get { return (TextDeck) GetValue(DeckProperty); } 
     set { SetValue(DeckProperty, value); } 
    } 
} 

public enum TextDeck 
{ 
    None = 0, 
    // 
    // Summary: 
    //  Underline is applied to the text. 
    Underline = 1, 
    // 
    // Summary: 
    //  Strikethrough is applied to the text. 
    Strikethrough = 2 
} 

CustomLabelRenderer.cs

public class CustomLabelRenderer : LabelRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Label> e) 
    { 
     base.OnElementChanged(e); 

     if (Control != null) 
     { 
      var element = Element as CustomLabel; 
      var underline = new Underline(); 
      var run = new Run(); 
      switch (element.Deck) 
      { 
       case TextDeck.None: 
        underline.TextDecorations = TextDecorations.None; 
        break; 
       case TextDeck.Strikethrough: 
        underline.TextDecorations = TextDecorations.Strikethrough; 
        break; 
       case TextDeck.Underline: 
        underline.TextDecorations = TextDecorations.Underline; 
        break; 
      } 
      run.Text = element.Text; 
      underline.Inlines.Add(run); 
      Control.Inlines.Clear(); 
      Control.Inlines.Add(underline); 
     } 
    } 
} 

사용

<local:CustomLabel Deck="Underline" Text="Welcome to Xamarin.Forms!" /> 

enter image description here