所以我正在寻找的是一个代码,它会检查用户是否写了一个特定的词(选择、从、哪里)。如果为 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

c# - 在 &lt;Editor&gt; 中输入单词后检查用户是否输入了特定单词-LMLPHP

表单控件

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/

10-11 22:28
查看更多