簡體   English   中英

Xamarin Forms 條目中的刪除線文本

[英]Strikethrough text in Entry in Xamarin Forms

最近我遇到了一個業務需求,我必須在 Xamarin 表單的條目中顯示刪除線文本。 現在Label中有刪除線的Text裝飾屬性,但Entry沒有這樣的屬性。 現在我們有一個這樣的條目, 在此處輸入圖片說明

但是我們需要在sddad上顯示刪除線。 有一些資源說要使用效果或 Unicode 的刪除線字符集。 但它不能滿足我們的需求。 有誰知道如何實現這一點,以便我們可以通過屬性綁定將文本更改為帶有刪除線?

任何幫助將不勝感激。

每當您希望 Xamarin.Forms 中的自定義 UI 行為不通過 Forms API 公開時,您將需要深入到平台級別。

刪除線文本可以使用以下任何一個來實現: CustomRendererEffectBehaviour

以下是將刪除整個文本的平台效果示例:

定義效果

在你的跨平台項目中創建一個新的RoutingEffect

using Xamarin.Forms;

namespace StrikethroughEntry.Effects
{
    public class StrikethroughEntryEffect : RoutingEffect
    {
        public StrikethroughEntryEffect()
            : base("StrikethroughEntry.Effects.StrikethroughEntryEffect")
        {
        }
    }
}

在 iOS 上實施

在你的 iOS 項目的某個地方創建一個PlatformEffect

using Foundation;
using StrikethroughEntry.Effects;
using StrikethroughEntry.iOS;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ResolutionGroupName("StrikethroughEntry.Effects")]
[assembly: ExportEffect(typeof(iOSStrikethroughEntryEffect), nameof(StrikethroughEntryEffect))]

namespace StrikethroughEntry.iOS
{
    public class iOSStrikethroughEntryEffect : PlatformEffect
    {
        private static NSNumber _strikethroughStyle => new NSNumber((int)NSUnderlineStyle.Single);

        private string _originalText;

        protected override void OnAttached()
        {
            var textField = Control as UITextField;

            if (textField is null)
                return;

            _originalText = textField.Text;

            var attributedText = new NSMutableAttributedString(textField.Text);

            attributedText.AddAttribute(UIStringAttributeKey.StrikethroughStyle, _strikethroughStyle, new NSRange(0, textField.Text.Length));

            textField.AttributedText = attributedText;
        }

        protected override void OnDetached()
        {
            var textField = Control as UITextField;

            if (textField is null)
                return;

            textField.AttributedText = null;

            textField.Text = _originalText;
        }
    }
}

此示例展示了如何在不再需要效果后對其進行清理。 屬性字符串在 iOS 上的工作方式很容易將刪除線行為擴展到條目的目標部分。 也許您只想刪除特定的單詞等。

在 Android 上實現

在你的 Android 項目的某個地方創建一個PlatformEffect

using Android.Graphics;
using Android.Widget;
using StrikethroughEntry.Droid;
using StrikethroughEntry.Effects;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ResolutionGroupName("StrikethroughEntry.Effects")]
[assembly: ExportEffect(typeof(AndroidStrikethroughEntryEffect), nameof(StrikethroughEntryEffect))]

namespace StrikethroughEntry.Droid
{
    public class AndroidStrikethroughEntryEffect : PlatformEffect
    {
        private PaintFlags _originalFlags;

        protected override void OnAttached()
        {
            var editText = Control as EditText;

            if (editText is null)
                return;

            _originalFlags = editText.PaintFlags;

            editText.PaintFlags = PaintFlags.StrikeThruText;
        }

        protected override void OnDetached()
        {
            var editText = Control as EditText;

            if (editText is null)
                return;

            editText.PaintFlags = _originalFlags;
        }
    }
}

如果您想刪除Entry特定區域,則此實現將需要更新。

消費效果

此示例將通過 xaml:

  • 導入效果命名空間: xmlns:effects="clr-namespace:StrikethroughEntry.Effects"
  • 為目標Entry添加效果:
<Entry Text="This entry has strikethrough">
    <Entry.Effects>
        <effects:StrikethroughEntryEffect />
    </Entry.Effects>
</Entry>

結果

現在您有一個帶有刪除線文本的可愛Entry

安卓 IOS
帶有刪除線的 Android 條目 帶刪除線的 iOS 入口

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM