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

UWP中点击Canvas时如何避免TextBox丢失焦点

为什么AllowFocusOnInteraction属性对Gesture Canvas不生效

AllowFocusOnInteraction是仅针对可交互Control类派生控件生效的属性,作用是禁止用户交互时自动为该控件分配焦点。而Canvas属于Panel布局容器类,本身不具备可聚焦属性,也不属于交互控件范畴,因此为它设置AllowFocusOnInteraction不会有任何效果。
你点击Canvas时TextBox丢失焦点,是系统点击非输入交互区域时的默认行为:当点击没有绑定焦点处理逻辑的布局容器时,系统会自动收回当前输入控件的焦点。

实现点击Canvas时TextBox保持焦点的方案

有两种常用的实现方式,你可以根据自身需求选择:

方案1:不需要响应Canvas上的任何手势/点击事件

直接给Gesture Canvas添加IsHitTestVisible="False"属性即可,完全屏蔽Canvas的点击命中检测,点击时会直接穿透到下层元素,不会触发焦点丢失逻辑:

<Canvas x:Name="Gesture" Width="500" Height="500" Background="Gray" 
        AllowFocusOnInteraction="False"
        IsHitTestVisible="False">
</Canvas>

方案2:需要响应Canvas上的手势/点击操作

处理Canvas的点击事件,将事件标记为已处理,阻断系统默认的焦点收回逻辑:
首先修改XAML添加事件绑定:

<Canvas x:Name="Gesture" Width="500" Height="500" Background="Gray" 
        AllowFocusOnInteraction="False"
        PointerPressed="Gesture_PointerPressed">
</Canvas>

然后在后台代码添加事件处理逻辑:

private void Gesture_PointerPressed(object sender, PointerRoutedEventArgs e)
{
    // 标记事件已处理,阻止系统默认的焦点转移逻辑
    e.Handled = true;
    // 你自己的手势处理逻辑可以写在下方
}

如果你使用的是WPF框架,把上述XAML中的PointerPressed事件替换为PreviewMouseDown事件,后台事件参数改为MouseButtonEventArgs,同样设置e.Handled = true即可实现相同效果。

内容的提问来源于stack exchange,提问作者PremKumar Shanmugam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:24:04