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

MAUI中Entry选中后Label文本未更新问题排查(Windows平台)

MAUI Entry控件TapGesture在Windows平台失效的解决方案

问题根源

Windows平台下,Entry的原生输入控件会优先响应鼠标点击事件以获取焦点,这会拦截TapGestureRecognizer的触发逻辑,导致绑定的SetSelectedEntryCommand未执行,最终Label文本无更新。该问题和是否使用触摸屏无关,是平台原生事件优先级导致的拦截。

解决方案

方案1:改用Focused事件替代TapGesture(推荐)

Entry的“选中”行为本质就是获取焦点,直接绑定Focused事件更贴合控件交互逻辑,且跨平台通用:

修改XAML代码:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:MyProject"
             x:Class="MyProject.TestPage"
             x:DataType="vm:TestViewModel"
             Title="TestPage">
    <VerticalStackLayout>
        <Entry x:Name="Entry1" Text="Entry 1" Focused="Entry_Focused" />
        <Entry x:Name="Entry2" Text="Entry 2" Focused="Entry_Focused" />
  
        <Label Text="{Binding SelectedEntry.Text}" />
    </VerticalStackLayout>
</ContentPage>

在TestPage后台添加事件处理:

public partial class TestPage : ContentPage
{
    public TestPage(TestViewModel model)
    {
        InitializeComponent();
        BindingContext = model;
        model.InitializeCommand.Execute(Entry1);
    }

    private void Entry_Focused(object sender, FocusEventArgs e)
    {
        if (sender is Entry entry && BindingContext is TestViewModel vm)
        {
            vm.SetSelectedEntryCommand.Execute(entry);
        }
    }
}

方案2:优化MVVM架构(最佳实践)

当前ViewModel直接持有Entry控件,违反了MVVM的视图与逻辑分离原则,建议改为绑定文本属性:

修改ViewModel:

public partial class TestViewModel : ObservableObject
{
    [ObservableProperty]
    string _selectedEntryText;

    [ObservableProperty]
    string _entry1Text = "Entry 1";

    [ObservableProperty]
    string _entry2Text = "Entry 2";

    [RelayCommand]
    void Initialize()
    {
        SelectedEntryText = Entry1Text;
    }

    [RelayCommand]
    void SetSelectedEntry(string text)
    {
        SelectedEntryText = text;
    }
}

修改XAML:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm="clr-namespace:MyProject"
             x:Class="MyProject.TestPage"
             x:DataType="vm:TestViewModel"
             Title="TestPage">
    <VerticalStackLayout>
        <Entry Text="{Binding Entry1Text}" Focused="Entry_Focused" />
        <Entry Text="{Binding Entry2Text}" Focused="Entry_Focused" />
  
        <Label Text="{Binding SelectedEntryText}" />
    </VerticalStackLayout>
</ContentPage>

后台事件调整:

private void Entry_Focused(object sender, FocusEventArgs e)
{
    if (sender is Entry entry && BindingContext is TestViewModel vm)
    {
        vm.SetSelectedEntryCommand.Execute(entry.Text);
    }
}

内容的提问来源于stack exchange,提问作者D G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:58:14