2017-02-06 5 views
0

Я напишу список дел, и ярлык элемента должен быть вычеркнут, когда его сделано и удалено при отмене. Вычеркивание на клик работает, но я не могу удалить его, когда он уже вычеркнут. Мои подходы заключались в RemoveAttribute на NSMutableAttributedString или, возможно, для перерисовки всей метки.Как удалить эффект выпадения ярлыка

[assembly:ResolutionGroupName(OvanTasks.LabelStrikeOutEffect.EffectNamespace)] 
[assembly: ExportEffect(typeof(LabelStrikeOutEffect), nameof(LabelStrikeOutEffect))] 
namespace OvanTasks.iOS 
{ 
    public class LabelStrikeOutEffect : PlatformEffect 
    { 
     public LabelStrikeOutEffect() 
     { 
     } 

     protected override void OnAttached() 
     { 
      SetStrikeOut(true); 
     } 

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

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

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

    private void SetStrikeOut(bool strikeout) 
    { 
     try 
     { 
      var label = (UILabel)Control; 
      var text = (NSMutableAttributedString)label.AttributedText; 
      var range = new NSRange(0, text.Length); 


      if (strikeout) 
      { 
       text.AddAttribute(UIStringAttributeKey.StrikethroughStyle, NSNumber.FromInt32((int)NSUnderlineStyle.Single), range); 
      } 
      else 
      { 
       Device.BeginInvokeOnMainThread(() => { 
        text.RemoveAttribute(UIStringAttributeKey.StrikethroughStyle, range); 
       }); 
      } 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Cannot strike out Label. Error: " + ex.Message.ToString()); 
     } 
     finally { 
      Control.SetNeedsDisplay(); 
     } 
    } 

    } 
} 

ответ

0

Хорошо, у меня есть решение. Я просто переопределяю AttributedText метки с новыми атрибутами.

if (strikeout) 
{ 
    var newText = new NSMutableAttributedString(text.Value); 
    newText.AddAttribute(UIStringAttributeKey.StrikethroughStyle, NSNumber.FromInt32((int)NSUnderlineStyle.Single), range); 
    label.AttributedText = newText; 
} 
else 
{ 
    var newText = new NSMutableAttributedString(text.Value); 
    label.AttributedText = newText; 
}