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

如何在.NET MAUI中创建含不可编辑文本段的Entry控件

在.NET MAUI中实现部分不可编辑的Entry控件

下面提供两种实用方案,帮你实现固定后缀不可编辑的Entry控件:

方法一:利用TextChanged事件快速实现

这种方案无需自定义控件,直接通过事件处理强制保留固定后缀,同时限制光标位置防止用户修改后缀区域。

XAML代码

<Entry x:Name="SuffixLockedEntry" 
       Text="example.jpg" 
       TextChanged="SuffixLockedEntry_TextChanged" />

后台代码(以MainPage.xaml.cs为例)

// 定义固定不可编辑的后缀
private const string _fixedSuffix = ".jpg";

private void SuffixLockedEntry_TextChanged(object sender, TextChangedEventArgs e)
{
    if (sender is not Entry entry) return;

    var newText = e.NewTextValue ?? string.Empty;
    
    // 检查文本是否保留了固定后缀,没有则重新拼接
    if (!newText.EndsWith(_fixedSuffix))
    {
        // 提取用户输入的有效前缀(去掉错误的后缀部分)
        var userInput = newText.Split('.')[0];
        entry.Text = $"{userInput}{_fixedSuffix}";
    }

    // 强制光标停在后缀前,避免用户编辑后缀
    entry.CursorPosition = entry.Text.Length - _fixedSuffix.Length;
}

方法二:自定义Entry控件(复用性更强)

如果需要在多个页面使用该功能,自定义控件是更优雅的选择,可封装逻辑并对外暴露配置属性。

1. 创建自定义控件类

using Microsoft.Maui.Controls;

namespace YourAppName.Controls;

public class FixedSuffixEntry : Entry
{
    // 定义可绑定的固定后缀属性
    public static readonly BindableProperty FixedSuffixProperty =
        BindableProperty.Create(nameof(FixedSuffix), typeof(string), typeof(FixedSuffixEntry), string.Empty,
            propertyChanged: OnFixedSuffixUpdated);

    public string FixedSuffix
    {
        get => (string)GetValue(FixedSuffixProperty);
        set => SetValue(FixedSuffixProperty, value);
    }

    // 后缀变更时自动修正文本
    private static void OnFixedSuffixUpdated(BindableObject bindable, object oldValue, object newValue)
    {
        if (bindable is FixedSuffixEntry entry && !string.IsNullOrEmpty(entry.Text))
        {
            var userPart = entry.Text.Split('.')[0];
            entry.Text = $"{userPart}{newValue}";
        }
    }

    protected override void OnTextChanged(string oldValue, string newValue)
    {
        base.OnTextChanged(oldValue, newValue);

        if (string.IsNullOrEmpty(FixedSuffix)) return;

        string correctedText;
        // 用户清空文本时自动保留后缀
        if (string.IsNullOrEmpty(newValue))
        {
            correctedText = FixedSuffix;
        }
        // 文本未以固定后缀结尾时重新拼接
        else if (!newValue.EndsWith(FixedSuffix))
        {
            var userInput = newValue.Split('.')[0];
            correctedText = $"{userInput}{FixedSuffix}";
        }
        else
        {
            correctedText = newValue;
        }

        // 避免无限循环,仅在文本不同时更新
        if (correctedText != Text)
        {
            Text = correctedText;
        }

        // 锁定光标位置在后缀前
        CursorPosition = Text.Length - FixedSuffix.Length;
    }
}

2. 在XAML中使用自定义控件

先添加命名空间引用:

xmlns:controls="clr-namespace:YourAppName.Controls"

然后使用控件:

<controls:FixedSuffixEntry 
    Text="example.jpg" 
    FixedSuffix=".jpg" />

额外优化提示

  • 如果需要支持多种可选后缀,可扩展自定义控件添加AllowedSuffixes属性,判断用户输入的后缀是否合法,不合法则恢复默认后缀。
  • 上述代码已处理用户全选删除的场景,删除后会自动保留后缀,光标定位在后缀前方便输入。

内容的提问来源于stack exchange,提问作者Alpay Çalışır

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:43:19