当前位置: 首页 > news >正文

WPF 程序如何移动焦点到其他控件

WPF 中可以使用 UIElement.Focus() 将焦点设置到某个特定的控件,也可以使用 TraversalRequest 仅仅移动焦点。本文介绍如何在 WPF 程序中控制控件的焦点。


本文内容

    • `UIElement.Focus`
    • `TraversalRequest`
    • 关于逻辑焦点和键盘焦点
    • 跨窗口/跨进程切换焦点

UIElement.Focus

仅仅需要在任何一个控件上调用 Focus() 方法即可将焦点设置到这个控件上。

但是需要注意,要使 Focus() 能够工作,这个元素必须满足两个条件:

  • Focusable 设置为 true
  • IsVisibletrue

TraversalRequest

如果你并不是将焦点设置到某个特定的控件,而是希望将焦点转移,可以考虑使用 TraversalRequest 类。

比如,以下代码是将焦点转移到下一个控件,也就是按下 Tab 键时焦点会去的控件。

var traversalRequest = new TraversalRequest(FocusNavigationDirection.Next);
// view 是可视化树中的一个控件。
view.MoveFocus(traversalRequest);

关于逻辑焦点和键盘焦点

键盘焦点就是你实际上按键输入和快捷键会生效的焦点,也就是当前正在工作的控件的焦点。

而 WPF 有多个焦点范围(Focus Scope),按下 Tab 键切换焦点的时候只会在当前焦点范围切焦点,不会跨范围。那么一旦跨范围切焦点的时候,焦点会去哪里呢?答案是逻辑焦点。

每个焦点范围内都有一个逻辑焦点,记录如果这个焦点范围一旦获得焦点后应该在哪个控件获得键盘焦点。

比如默认情况下 WPF 每个 Window 就是一个焦点范围,那么每个 Window 中的当前焦点就是逻辑焦点。而一旦这个 Window 激活,那么这个窗口中的逻辑焦点就会成为键盘焦点,另一个窗口当中的逻辑焦点保留,而键盘焦点则丢失。

跨窗口/跨进程切换焦点

参见我的另一篇博客:

  • WPF 程序如何跨窗口/跨进程设置控件焦点

参考资料

  • winapi - Win32: C++: How do I re-focus on Parent Window after clicking in a child window? - Stack Overflow

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • EFI 分区/恢复分区不可删除?你需要使用命令行了(配合鼠标操作)
  • EFI 分区/恢复分区不可删除?你需要使用命令行了(全命令行操作)
  • 使用傲梅分区助手无损合并分区,无损调整分区大小
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • Windows 系统上用 .NET/C# 查找所有窗口,并获得窗口的标题、位置、尺寸、最小化、可见性等各种状态
  • 直击本质:WPF 框架是如何实现模态窗口的
  • 什么是模态窗口?本文带你了解模态窗口的本质
  • 使用 .editorconfig 配置 .NET/C# 项目的代码分析规则的严重程度
  • 如何在 .NET 项目中开启不安全代码(以便启用 unsafe fixed 等关键字)
  • WPF 高性能位图渲染 WriteableBitmap 及其高性能用法示例
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • 使用 Direct3D11 的 OpenSharedResource 方法渲染来自其他进程/设备的共享资源(SharedHandle)
  • 将 Direct3D11 在 GPU 中的纹理(Texture2D)导出到内存(Map)或导出成图片文件
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • C#/.NET 当我们在写事件 += 和 -= 的时候,方法是如何转换成事件处理器的
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • E-HPC支持多队列管理和自动伸缩
  • HTTP那些事
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Redis中的lru算法实现
  • session共享问题解决方案
  • SQLServer之创建数据库快照
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue--为什么data属性必须是一个函数
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 规范化安全开发 KOA 手脚架
  • 深度学习入门:10门免费线上课程推荐
  • 学习使用ExpressJS 4.0中的新Router
  • 异常机制详解
  • 优秀架构师必须掌握的架构思维
  • Android开发者必备:推荐一款助力开发的开源APP
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #宝哥教你#查看jquery绑定的事件函数
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (论文阅读11/100)Fast R-CNN
  • (转)http协议
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .Net 高效开发之不可错过的实用工具
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET连接数据库方式
  • .NET命令行(CLI)常用命令
  • ::什么意思
  • @angular/cli项目构建--http(2)
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [30期] 我的学习方法
  • [BUG]vscode插件live server无法自动打开浏览器