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
相关产品推荐
相关产品推荐

