You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Avalonia TextBox中的文本强制转为大写?

让Avalonia TextBox强制显示大写的几种方案

1. 修复TextInputOptions.Uppercase属性的使用问题

你尝试的TextInputOptions.Uppercase="True"无效,核心原因是XAML未正确引入对应命名空间。需要在根元素添加Avalonia.Input的命名空间引用:

xmlns:input="clr-namespace:Avalonia.Input;assembly=Avalonia.Input"

之后再正确使用该属性:

<TextBox Name="PasswordTextBox" input:TextInputOptions.Uppercase="True" />

注意:该属性仅在Avalonia 11及以上版本支持,若你的框架版本较低,需先升级。

2. 自定义可复用的附加属性

如果不想为每个TextBox重复编写后台事件,可以自定义附加属性实现全局复用:

using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;

public static class TextBoxExtensions
{
    public static readonly AttachedProperty<bool> ForceUppercaseProperty =
        AvaloniaProperty.RegisterAttached<TextBox, bool>("ForceUppercase", typeof(TextBoxExtensions));

    public static bool GetForceUppercase(TextBox element)
    {
        return element.GetValue(ForceUppercaseProperty);
    }

    public static void SetForceUppercase(TextBox element, bool value)
    {
        element.SetValue(ForceUppercaseProperty, value);
    }

    static TextBoxExtensions()
    {
        ForceUppercaseProperty.Changed.Subscribe(e =>
        {
            if (e.Sender is TextBox tb)
            {
                if ((bool)e.NewValue)
                {
                    tb.TextChanged += OnTextChanged;
                    tb.AddHandler(TextBox.TextInputEvent, OnTextInput, RoutingStrategies.Tunnel);
                }
                else
                {
                    tb.TextChanged -= OnTextChanged;
                    tb.RemoveHandler(TextBox.TextInputEvent, OnTextInput);
                }
            }
        });
    }

    private static void OnTextInput(object? sender, TextInputEventArgs e)
    {
        e.Text = e.Text?.ToUpperInvariant();
    }

    private static void OnTextChanged(object? sender, TextChangedEventArgs e)
    {
        if (sender is TextBox tb && tb.Text is { } text)
        {
            var caretIndex = tb.CaretIndex;
            var selectionLength = tb.SelectionLength;
            tb.Text = text.ToUpperInvariant();
            tb.CaretIndex = caretIndex;
            tb.SelectionLength = selectionLength;
        }
    }
}

在XAML中引用并使用:

xmlns:local="clr-namespace:你的项目命名空间"
<TextBox Name="PasswordTextBox" local:TextBoxExtensions.ForceUppercase="True" />

3. 通过样式批量应用

若需为多个TextBox统一启用强制大写,可通过样式批量配置:

<Style Selector="TextBox[local:TextBoxExtensions.ForceUppercase='True']">
    <Setter Property="local:TextBoxExtensions.ForceUppercase" Value="True" />
</Style>

之后只需给目标TextBox添加标记即可:

<TextBox Name="PasswordTextBox" local:TextBoxExtensions.ForceUppercase="True" />

内容的提问来源于stack exchange,提问作者Eric Bergman-Terrell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:12:36