2017-03-03 6 views

答えて

3

Xamarin.Formsはこの機能をそのまま使用できないため、各プラットフォームにcustom rendererを作成してラベルを拡張する必要があります。これにより、各プラットフォームのネイティブコントロール(AndroidではTextView、iOSではUILabel)にアクセスして、そこに取り消し線効果を実装することができます。

  1. Androidでは、TextViewのSTRIKE_THRU_TEXT_FLAGです。 someTextView.PaintFlags = Paint.StrikeThruText;
  2. iOSでは、Xamarinフォーラムのthis threadのガイダンスに従ってください。基本的には、UIStringAttributesを使用して目的の結果を達成します。

カスタムレンダリングを初めてお使いの方は、エントリコントロールhereのカスタマイズ方法に関する入門チュートリアルをご覧ください。


編集:実際には、エフェクトを使用してこれをオフにすることさえできます。詳細情報here

+0

注: 'someTextView.PaintFlags = PaintFlags.StrikeThruTextであるべきです。' ' PaintFlags'は 'Paint'ではなく、参照するための適切なenumです。 –

5

ここでは、独自のコントロール(strikedLabel)を作成してこのコードを配置することができます。 (...などIsStriked、StrikeColor、)それをより楽しくする、あなたのようなバインド可能なプロパティを追加することができflexiableするには、ラベルとBoxView内の順序は、それは次の操作を行い効果を使用することは非常に簡単です

<Grid> 
    <Label VerticalOptions="Center" Text="Sample string" /> 
    <BoxView HeightRequest="3" 
    VerticalOptions="Center" 
    Opacity="0.5" 
    Color="Aqua" /> 
</Grid> 
2

重要であることを覚えておいてください手順:

XAML

<Label Text="{Binding TotalReatilAmount}" > 
    <Label.Effects> 
     <Helpers:LineThroughEffect /> 
    </Label.Effects> 
</Label> 

はXAMLヘッダに線の下に置くことを忘れないでください

xmlns:Helpers="clr-namespace:MyNameSpace.Helpers" 

RoutingEffect

public class LineThroughEffect : RoutingEffect 
    {  
     public LineThroughEffect() : base("MyNameSpace.Helpers.PlatformLineThroughEffect") { } 
    } 

から継承する1つのクラスを作成するプラットフォームのための特定の

をレンダリング作成IOSの

[assembly: ResolutionGroupName("MyNameSpace.Helpers")] 
[assembly: ExportEffect(typeof(PlatformLineThroughEffect), nameof(PlatformLineThroughEffect))] 
namespace MyNameSpace.iOS.Renderers 
{ 
    public class PlatformLineThroughEffect : PlatformEffect 
    { 
     protected override void OnAttached() 
     { 
      SetUnderline(true); 
     } 

     protected override void OnDetached() 
     { 
      SetUnderline(false); 
     } 

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

      if (args.PropertyName == Label.TextProperty.PropertyName || 
       args.PropertyName == Label.FormattedTextProperty.PropertyName) 
      { 
       SetUnderline(true); 
      } 
     } 

     private void SetUnderline(bool underlined) 
     { 
      try 
      { 
       var label = (UILabel)Control; 
       if (label != null) 
       { 
        var text = (NSMutableAttributedString)label.AttributedText; 
        if (text != null) 
        { 
         var range = new NSRange(0, text.Length); 
         if (underlined) 
         { 
          text.AddAttribute(UIStringAttributeKey.StrikethroughStyle, 
           NSNumber.FromInt32((int)NSUnderlineStyle.Single), range); 
         } 
         else 
         { 
          text.RemoveAttribute(UIStringAttributeKey.StrikethroughStyle, range); 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       ex.Track(); 
      } 
     } 
    } 
} 
関連する問題