最近我遇到了一個業務需求,我必須在 Xamarin 表單的條目中顯示洗掉線文本。現在Label中有洗掉線的Text裝飾屬性,但Entry沒有這樣的屬性。現在我們有一個這樣的條目,

但是我們需要在sddad上顯示洗掉線。有一些資源說要使用效果或 Unicode 的洗掉線字符集。但它不能滿足我們的需求。有誰知道如何實作這一點,以便我們可以通過屬性系結將文本更改為帶有洗掉線?
任何幫助將不勝感激。
uj5u.com熱心網友回復:
每當您希望 Xamarin.Forms 中的自定義 UI 行為不通過 Forms API 公開時,您將需要深入到平臺級別。
洗掉線文本可以使用以下任何一個來實作:CustomRenderer、Effect、Behaviour。
以下是將洗掉整個文本的平臺效果示例:
定義效果
在您的跨平臺專案中創建一個新的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:
- Import the effects namespace:
xmlns:effects="clr-namespace:StrikethroughEntry.Effects" - Add effect to target
Entry:
<Entry Text="This entry has strikethrough">
<Entry.Effects>
<effects:StrikethroughEntryEffect />
</Entry.Effects>
</Entry>
Results
Now you have a lovely Entry with strikethrough text!
| Android | iOS |
|---|---|
![]() |
![]() |
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/339386.html


