c# - Xamarin 表单中的条目中的删除线文本
问题描述
最近我遇到了一个业务需求,我必须在 Xamarin 表单的条目中显示删除线文本。现在Label中有删除线的Text修饰属性,但是Entry没有这样的属性。现在我们有一个这样的条目,
但是我们需要在sddad上显示一个删除线。有一些资源说使用效果或 Unicode 的删除线字符集。但它并不能满足我们的需求。有谁知道如何实现这一点,以便我们可以通过属性绑定将文本更改为删除线?
任何帮助将不胜感激。
解决方案
每当您想要 Xamarin.Forms 中未通过 Forms API 公开的自定义 UI 行为时,您都需要进入平台级别。
删除线文本可以使用以下任何一种来实现: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:
- 导入效果命名空间:
xmlns:effects="clr-namespace:StrikethroughEntry.Effects"
- 为目标添加效果
Entry
:
<Entry Text="This entry has strikethrough">
<Entry.Effects>
<effects:StrikethroughEntryEffect />
</Entry.Effects>
</Entry>
结果
现在你有一个可爱Entry
的带删除线的文字!
推荐阅读
- jenkins - Jenkins Pipeline-如何使用发布插件?
- c# - 在 C# 中使用字符串参数调用 Fortran DLL
- amazon-web-services - AWS Lambda NodeJS 启动 EMR Spark 问题
- c++ - UE4:通过 C++ 或蓝图添加时组件的不同细节面板
- spring - 如何立即停止 Spring Cloud Data Flow 中的作业
- jquery - 如何在 jquery 的工具提示中使用tippy .js
- node.js - 带异步/等待的三级深度图
- android - 如何在 Android 应用上自动切换到暗模式?
- java - 在同一窗口中显示具有 rowHeaders 的同一 JTable 的多个副本
- lstm - 我正在尝试实现一个 lstm 模型,我需要按列填充。这个怎么做?