所以我正在寻找的是一个代码,它会检查用户是否写了一个特定的词(选择、从、哪里)。如果为 true,则该单词的 textcolor 必须更改(TextChanged 事件)。我不知道我必须如何做到这一点,这是可能的。
我正在使用 Xamarin.Forms
并在 Page.xaml
中制作了以下代码:
<Editor x:Name="qEditor"
Text="Input"
TextChanged="Handle_TextChanged"
BackgroundColor="White"
HorizontalOptions="FillAndExpand"
HeightRequest="75"/>
所以每当有人输入一个特定的词时,只有那个词的颜色必须直接变成红色。
Page.xaml.cs
中的代码:void Handle_TextChanged(object sender, TextChangedEventArgs e)
{
string input = e.NewTextValue;
string[] qInput = input.Split(' ');
//Code here
}
我在 Google 和 Stackoverflow 以及 found something 上看了很多,但它使用的
Contains
对我的代码不起作用。如果您对我需要更改的内容有任何建议,或者即使我必须更改上述代码的所有内容,请给我一些建议。该项目要求我只使用
C#
和 Xamarin.Forms
。 最佳答案
Xamarin 表单不支持开箱即用。
您必须扩展 Editor
控件以添加对格式化文本的支持。这可以通过添加 FormattedString
类型的可绑定(bind)属性来完成。该控件将通过 TextChanged
事件监听文本更改来保持属性更新(在这种情况下我使用了 Regex
)。
由于 FormattedText
将是 bindable-property,自定义平台渲染器可以检测到更改,并相应地将其渲染为 android 中的 Spannable
和 iOS 中的 AttributedString
。
表单控件
public class ExEditor : Editor
{
public static readonly BindableProperty FormattedTextProperty =
BindableProperty.Create(
"FormattedText", typeof(FormattedString), typeof(ExEditor),
defaultValue: default(FormattedString));
public FormattedString FormattedText
{
get { return (FormattedString)GetValue(FormattedTextProperty); }
set { SetValue(FormattedTextProperty, value); }
}
public ExEditor()
{
TextChanged += ExEditor_TextChanged;
}
void ExEditor_TextChanged(object sender, TextChangedEventArgs e)
{
if (string.IsNullOrWhiteSpace(Text))
return;
var pattern = @"\b(SELECT|WHERE|AND|OR)\b";
var words = Regex.Split(Text, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline);
var formattedString = new FormattedString();
foreach (var word in words)
formattedString.Spans.Add(new Span
{
Text = word,
BackgroundColor = BackgroundColor,
FontSize = FontSize,
FontFamily = FontFamily,
FontAttributes = FontAttributes,
ForegroundColor = Regex.IsMatch(word, pattern, RegexOptions.IgnoreCase) ? Color.Red : TextColor
});
FormattedText = formattedString;
}
}
iOS 渲染器
[assembly: ExportRenderer(typeof(ExEditor), typeof(ExEditorRenderer))]
namespace SampleApp.iOS
{
public class ExEditorRenderer : EditorRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
base.OnElementChanged(e);
if (Control == null || Element == null)
return;
UpdateTextOnControl();
}
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == nameof(ExEditor.FormattedText)
|| e.PropertyName == nameof(Editor.FontFamily)
|| e.PropertyName == nameof(Editor.FontSize)
|| e.PropertyName == nameof(Editor.TextColor)
|| e.PropertyName == nameof(Editor.BackgroundColor)
|| e.PropertyName == nameof(Editor.FontAttributes))
{
UpdateTextOnControl();
}
}
void UpdateTextOnControl()
{
var caretPos = Control.GetOffsetFromPosition(Control.BeginningOfDocument, Control.SelectedTextRange.Start);
if (Element is ExEditor formsElement)
if (formsElement.FormattedText != null)
Control.AttributedText = formsElement.FormattedText.ToAttributed(new Font(), Element.TextColor);
var newPosition = Control.GetPosition(Control.BeginningOfDocument, offset: caretPos);
Control.SelectedTextRange = Control.GetTextRange(newPosition, newPosition);
}
}
}
安卓渲染器
[assembly: ExportRenderer(typeof(ExEditor), typeof(ExEditorRenderer))]
namespace SampleApp.Android
{
public class ExEditorRenderer : EditorRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
base.OnElementChanged(e);
if (Control == null || Element == null)
return;
UpdateTextOnControl();
}
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == nameof(ExEditor.FormattedText)
|| e.PropertyName == nameof(Editor.FontFamily)
|| e.PropertyName == nameof(Editor.FontSize)
|| e.PropertyName == nameof(Editor.TextColor)
|| e.PropertyName == nameof(Editor.BackgroundColor)
|| e.PropertyName == nameof(Editor.FontAttributes))
{
UpdateTextOnControl();
}
}
void UpdateTextOnControl()
{
var caretPos = Control.SelectionStart;
if (Element is ExEditor formsElement)
if (formsElement.FormattedText != null)
Control.SetText(formsElement.FormattedText.ToAttributed(new Font(), Element.TextColor, Control),
TextView.BufferType.Spannable);
Control.SetSelection(caretPos);
}
}
}
示例用法
<!-- make sure to map local prefix to control's namespace -->
<local:ExEditor Text="Select * from Table where text='1' and type='str'"
VerticalOptions="Start" />
关于c# - 在 <Editor> 中输入单词后检查用户是否输入了特定单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46487436/