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

【WPF.NET开发】WPF中的焦点

本文内容

  1. 键盘焦点
  2. 逻辑焦点
  3. 键盘导航
  4. 以编程方式导航焦点
  5. 焦点事件

在 WPF 中,有两个与焦点有关的主要概念:键盘焦点和逻辑焦点。 键盘焦点指接收键盘输入的元素,而逻辑焦点指焦点范围中具有焦点的元素。 本概述详细介绍了这些概念。 对于创建具有多个可获取焦点的区域的复杂应用程序来说,理解这些概念之间的区别非常重要。

参与焦点管理的主要类是 Keyboard 类、FocusManager 类和基本元素类,例如 UIElement 和 ContentElement。

Keyboard 类主要与键盘焦点相关,而 FocusManager 主要与逻辑焦点相关,但这种区别不是绝对的。 具有键盘焦点的元素也具有逻辑焦点,但具有逻辑焦点的元素不一定具有键盘焦点。 使用 Keyboard 类来设置具有键盘焦点的元素时,这一点就很明显,因为它还在元素上设置逻辑焦点。

1、键盘焦点

键盘焦点指当前正在接收键盘输入的元素。 在整个桌面上,只能有一个具有键盘焦点的元素。 在 WPF 中,具有键盘焦点的元素会将 IsKeyboardFocused 设置为 true。 Keyboard 类的静态属性 FocusedElement 获取当前具有键盘焦点的元素。

为使元素获得键盘焦点,必须将基元素的 Focusable 和 IsVisible 属性设置为 true。 某些类(例如 Panel 基类)默认将 Focusable 设置为 false;因此,如果要此类元素能够获得键盘焦点,必须将 Focusable 设置为 true

可通过用户与 UI 交互(例如,按 Tab 键导航到某个元素或者在某些元素上单击鼠标)来获取键盘焦点。 也可以使用 Keyboard 类的 Focus 方法以编程方式获取键盘焦点。 Focus 方法尝试为指定元素提供键盘焦点。 返回的元素是具有键盘焦点的元素,如果旧的或新的焦点对象阻止请求,则具有键盘焦点的元素可能不是请求的元素。

以下示例使用 Focus 方法将键盘焦点设置在 Button 上。

C#复制

private void OnLoaded(object sender, RoutedEventArgs e)
{// Sets keyboard focus on the first Button in the sample.Keyboard.Focus(firstButton);
}

基元素类的 IsKeyboardFocused 属性获取一个值,该值指示元素是否具有键盘焦点。 基元素类的 IsKeyboardFocusWithin 属性获取一个值,该值指示元素或其任何一个视觉子元素是否具有键盘焦点。

如果在应用程序启动时设置初始焦点,接收焦点的元素必须位于应用程序加载的初始窗口的可视化树中,并且该元素必须将 Focusable 和 IsVisible 设置为 true。 Loaded 事件处理程序是设置初始焦点的推荐位置。 还可以通过调用 Invoke 或 BeginInvoke 来使用 Dispatcher 回叫。

2、逻辑焦点

逻辑焦点是指焦点范围内的FocusManager.FocusedElement。 焦点范围是一个元素,用于跟踪其范围内的 FocusedElement。 键盘焦点离开焦点范围时,焦点元素会失去键盘焦点,但保留逻辑焦点。 键盘焦点返回到焦点范围时,焦点元素会再次获得键盘焦点。 这使得键盘焦点可在多个焦点范围之间切换,但确保了焦点返回到焦点范围时,焦点范围中的焦点元素重新获得键盘焦点。

一个应用程序中可以有多个具有逻辑焦点的元素,但在一个特定的焦点范围中只能有一个具有逻辑焦点的元素。

具有键盘焦点的元素还具有其所属焦点范围的逻辑焦点。

通过将 FocusManager 附加属性 IsFocusScope 设置为 true,可将元素转换为 Extensible Application Markup Language (XAML) 中的焦点范围。 在代码中,可通过调用 SetIsFocusScope 将元素转换为焦点范围。

以下示例通过设置 IsFocusScope 附加属性将 StackPanel 转换为焦点范围。

XAML复制

<StackPanel Name="focusScope1" FocusManager.IsFocusScope="True"Height="200" Width="200"><Button Name="button1" Height="50" Width="50"/><Button Name="button2" Height="50" Width="50"/>
</StackPanel>

C#复制

StackPanel focuseScope2 = new StackPanel();
FocusManager.SetIsFocusScope(focuseScope2, true);

GetFocusScope 返回指定元素的焦点范围。

WPF 中默认为焦点范围的类是 Window、MenuItem、ToolBar 和 ContextMenu。

GetFocusedElement 获取指定焦点范围的焦点元素。 SetFocusedElement 设置指定焦点范围中的焦点元素。 SetFocusedElement 通常用于设置初始焦点元素。

以下示例在焦点范围上设置焦点元素并获取焦点范围的焦点元素。

C#复制

3、键盘导航

按下导航键之一时,KeyboardNavigation 类负责实现默认键盘焦点导航。 导航键包括:Tab、Shift+Tab、Ctrl+Tab、Ctrl+Shift+Tab、向上键、向下键、向左键和向右键。

可以通过设置附加的 KeyboardNavigation 属性 TabNavigation、ControlTabNavigation 和 DirectionalNavigation 来更改导航容器的导航行为。 这些属性的类型为 KeyboardNavigationMode,可能的值为 Continue、Local、Contained、Cycle、Once 和 None。 默认值为 Continue,表示该元素不是导航容器。

以下示例创建具有多个 MenuItem 对象的 Menu。 TabNavigation 附加属性在 Menu 上设置为 Cycle。 使用 Tab 键在 Menu 中改变焦点时,焦点会从每个元素上移过,到达最后一个元素后会返回第一个元素。

XAML复制

<Menu KeyboardNavigation.TabNavigation="Cycle"><MenuItem Header="Menu Item 1" /><MenuItem Header="Menu Item 2" /><MenuItem Header="Menu Item 3" /><MenuItem Header="Menu Item 4" />
</Menu>

C#复制

Menu navigationMenu = new Menu();
MenuItem item1 = new MenuItem();
MenuItem item2 = new MenuItem();
MenuItem item3 = new MenuItem();
MenuItem item4 = new MenuItem();navigationMenu.Items.Add(item1);
navigationMenu.Items.Add(item2);
navigationMenu.Items.Add(item3);
navigationMenu.Items.Add(item4);KeyboardNavigation.SetTabNavigation(navigationMenu,KeyboardNavigationMode.Cycle);

4以编程方式导航焦点

与焦点结合使用的其他 API 是 MoveFocus 和 PredictFocus。

MoveFocus 将焦点转移到应用程序中的下一个元素。 TraversalRequest 用于指定方向。 传递给 MoveFocus 的 FocusNavigationDirection 指定焦点可移动的各个方向,例如 First、Last、Up 和 Down。

以下示例使用 MoveFocus 更改焦点元素。

C#复制

// Creating a FocusNavigationDirection object and setting it to a
// local field that contains the direction selected.
FocusNavigationDirection focusDirection = _focusMoveValue;// MoveFocus takes a TraveralReqest as its argument.
TraversalRequest request = new TraversalRequest(focusDirection);// Gets the element with keyboard focus.
UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;// Change keyboard focus.
if (elementWithFocus != null)
{elementWithFocus.MoveFocus(request);
}

PredictFocus 返回在焦点更改时接收焦点的对象。 目前,PredictFocus 仅支持 Up、Down、Left 和 Right。

焦点事件

与键盘焦点相关的事件是 PreviewGotKeyboardFocus、GotKeyboardFocus 和 PreviewLostKeyboardFocus、LostKeyboardFocus。 这些事件定义为 Keyboard 类上的附加事件,但更多地作为基元素类上的等效路由事件来访问。 

元素获得键盘焦点时会引发 GotKeyboardFocus。 元素丢失键盘焦点时会引发 LostKeyboardFocus。 如果已处理 PreviewGotKeyboardFocus 事件或 PreviewLostKeyboardFocusEvent 事件并将 Handled 设置为 true,则焦点不会改变。

以下示例将 GotKeyboardFocus 和 LostKeyboardFocus 事件处理程序附加到 TextBox。

XAML复制

<Border BorderBrush="Black" BorderThickness="1"Width="200" Height="100" Margin="5"><StackPanel><Label HorizontalAlignment="Center" Content="Type Text In This TextBox" /><TextBox Width="175"Height="50" Margin="5"TextWrapping="Wrap"HorizontalAlignment="Center"VerticalScrollBarVisibility="Auto"GotKeyboardFocus="TextBoxGotKeyboardFocus"LostKeyboardFocus="TextBoxLostKeyboardFocus"KeyDown="SourceTextKeyDown"/></StackPanel>
</Border>

TextBox 获得键盘焦点时,TextBox 的 Background 属性更改为 LightBlue。

C#复制

private void TextBoxGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{TextBox source = e.Source as TextBox;if (source != null){// Change the TextBox color when it obtains focus.source.Background = Brushes.LightBlue;// Clear the TextBox.source.Clear();}
}

TextBox 丢失键盘焦点时,TextBox 的 Background 属性变回白色。

C#复制

private void TextBoxLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{TextBox source = e.Source as TextBox;if (source != null){// Change the TextBox color when it loses focus.source.Background = Brushes.White;// Set the  hit counter back to zero and updates the display.this.ResetCounter();}
}

与逻辑焦点相关的事件是 GotFocus 和 LostFocus。 这些事件在 FocusManager 上定义为附加事件,但 FocusManager 不公开 CLR 事件包装器。 UIElement 和 ContentElement 可以更方便地公开这些事件。

相关文章:

【WPF.NET开发】WPF中的焦点

本文内容 键盘焦点逻辑焦点键盘导航以编程方式导航焦点焦点事件 在 WPF 中&#xff0c;有两个与焦点有关的主要概念&#xff1a;键盘焦点和逻辑焦点。 键盘焦点指接收键盘输入的元素&#xff0c;而逻辑焦点指焦点范围中具有焦点的元素。 本概述详细介绍了这些概念。 对于创建…...

【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】

文章目录 一.【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】1.1 项目主题:豆瓣电影二.代码剖析2.1 项目效果展示2.2 服务端代码剖析2.3 数据分析2.4 数据评分三.寄语四.本案例完整源码下载一.【计算机设计大赛作品】豆瓣…...

VS2019启动编辑并继续不起作用(.NET)

直接上方案 1)请确保您取消选中工具>选项>调试>常规下的选项&#xff1a;使用托管兼容模式和要求源文件与原始版本完全匹配。如下图&#xff1a; 2)请先取消选中编辑并继续选项&#xff0c;然后关闭您的旧解决方案&#xff0c;删除解决方案文件夹中的.vs隐藏文件夹&a…...

FFmpeg处理音视频的常用API及一般流程

FFmpeg是一个开源的音视频处理库&#xff0c;提供了丰富的API用于音视频的编解码、转码、过滤、播放等操作。 一、使用FFmpeg API解码涉及到的函数及一般流程如下&#xff1a; 1. av_register_all(): 注册所有的编解码器和格式。 av_register_all(); 2. avformat_open_inpu…...

Kotlin协程学习之-01

由于协程需要支持挂起、恢复、因此对于挂起点的状态保存就显得机器关键。类似的&#xff0c;线程会因为CPU调度权的切换而被中断&#xff0c;它的中断状态会保存在调用栈当中&#xff0c;因而协程的实现也按照是否开辟相应的调用栈存在以下两种类型&#xff1a; 有栈协程&…...

214.【2023年华为OD机试真题(C卷)】测试用例执行计划(排序题-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-测试用例执行计划二.解题思路三.题解代码Pytho…...

数一下 1到 100 的所有整数中出现多少个数字9并输出这些数字

分析&#xff1a; 我们知道 1-100的整数 i 中&#xff0c;9会出现在十位和个位上&#xff0c;数9出现的次数可以通过以下来实现&#xff1a; 个位是9 // i % 10得到整数 i 个位上的数十位是9 // i / 10得到整数 i 除了个位数的数字 这也是做这道题之后&#xff0c;我们需要…...

07. HTTP接口请求重试怎么处理?

目录 1、前言 2、实现方式 2.1、循环重试 2.2、递归重试 2.3、Spring Retry 2.4、Resilience4j 2.5、http请求网络工具内置重试方式 2.6、自定义重试工具 2.7、并发框架异步重试 2.8、消息队列 3、小结 1、前言 HTTP接口请求重试是指在请求失败时&#xff0c;再次发…...

分割数组的最大差值 - 华为OD统一考试

分割数组的最大差值 - 华为OD统一考试 OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 给定一个由若干整数组成的数组nums ,可以在数组内的任意位置进行分割,将该数组分割成两个非空子数组(即左数组和右数组),分别对子数组求和得到两个值.计算这两个值的差值…...

基于 Python+Django 技术栈,我开发了一款视频管理系统

学习过程中&#xff0c;遇到问题可以咨询作者 大家好&#xff0c;作为一名开发人员&#xff0c;平时比较愿意动手尝试各种有意思工具&#xff0c;因为笔者非常喜欢观看视频&#xff0c;尤其是YouTube、bilibili都是笔者非常喜欢的视频网站&#xff0c;所以想自己实现一个视频点…...

Python从入门到网络爬虫(内置函数详解)

前言 Python 内置了许多的函数和类型&#xff0c;比如print()&#xff0c;input()等&#xff0c;我们可以直接在程序中使用它们&#xff0c;非常方便&#xff0c;并且它们是Python解释器的底层实现的&#xff0c;所以效率是比一般的自定义函数更有效率。目前共有71个内置函数&…...

Python新年烟花代码

Pygame 绘制烟花的基本原理 1&#xff0c;发射阶段&#xff1a;在这一阶段烟花的形状是线性向上&#xff0c;通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动&#xff0c;运动过程中 5个点被赋予不同大小的加速度&#xff0c;随着时间推移&#xff0c;后面的…...

oracle语法学习

oracle语法学习 1.备份表 create table bd_psndoc_temp as select * from bd_psndoc2.还原表 drop table bd_psndoc; create table bd_psndoc as select * from bd_psndoc_temp3.查询表的前5条记录 select * from bd_psndoc_temp where rownum<54.从一个表中复制所有的列…...

网络安全常见漏洞类型总结

网络安全常见漏洞类型总结 1、弱口令 原因&#xff1a; 与个人习惯和安全意识相关&#xff0c;为了避免忘记密码&#xff0c;使用一个非常容易记住的密码&#xff0c;或者是直接采用系统的默认密码等。 危害&#xff1a; 通过弱口令&#xff0c;攻击者可以进入后台修改资料&a…...

C++自制小游戏《屠夫躲猫猫》

大家好&#xff0c;我是派蒙&#xff0c;我写了一个《屠夫躲猫猫》的游戏&#xff0c;下面是源代码&#xff1a; #include <stdio.h> #include <conio.h> #include<bits/stdc.h> #include<windows.h> using namespace std; string ID[1001]; string N…...

LabVIEW在高级结构监测中的创新应用

LabVIEW在高级结构监测中的创新应用 LabVIEW作为一个强大的系统设计平台&#xff0c;其在基于BOTDA&#xff08;光时域反射分析&#xff09;技术的结构监测中发挥着核心作用。利用LabVIEW的高效数据处理能力和友好的用户界面&#xff0c;开发了一个先进的监测系统。该系统专门…...

关于GitHub的git推送命令时报错密码授权失败问题

参考文章&#xff1a;https://cloud.tencent.com/developer/article/2362326?areaId106001 问题描述 当新建GitHub仓库后&#xff0c;通过git clone xxxx&#xff0c;命令克隆仓库到本地&#xff0c;想要提交修改内容&#xff0c;此时会报错443链接远程仓库失败&#xff0c;解…...

WPF Blend for visual studio使用

Blend for visual studio介绍 VS自带的Blend for visual studio是专门用来做WPF、Metro等的界面设计的可视化工具&#xff0c;其功能和PS类似。其目的让做界面和后台的程序分开&#xff0c;能快速绘制形状和路径、修改对象样式、动态显示对象(动画)、显示数据等高级操作。VS与B…...

云卷云舒:【实战篇】Redis迁移

1. 简介 Remote Dictionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统&#xff0c;是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 2. 迁移原理 redis-sh…...

[C#]yolov8-onnx在winform部署手势识别模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…...

【uniapp】 uniapp 修改tabBar图标大小和navigationBar字体大小

app.vue文件中修改 //导航栏字体 .uni-page-head .uni-page-head__title{font-size: 30rpx !important; } // tab图标 .uni-tabbar .uni-tabbar__icon {width: 25rpx !important;height: 25rpx !important; }大佬地址&#xff1a;https://blog.csdn.net/AAAXiaoApple/article/…...

Visual Studio 2017 + opencv4.6 + contribute + Cmake(Aruco配置版本)指南

之前配置过一次这个&#xff0c;想起这玩意就难受&#xff0c;贼难配置。由于要用到里面的一个库&#xff0c;不得已再进行配置。看网上的博客是真的难受&#xff0c;这写一块&#xff0c;那里写一块&#xff0c;乱七八糟&#xff0c;配置一顿发现写的都是错的&#xff0c;还得…...

自定义事件总线

文章目录 什么是自定义事件总线具体实现思路分析定义结构实现 on实现 emit实现 off 源码 什么是自定义事件总线 自定义事件总线属于一种观察着模式&#xff0c;其中包括三个角色发布者&#xff08;Publisher&#xff09;&#xff1a;发出事件&#xff08;Event&#xff09;订阅…...

212.【2023年华为OD机试真题(C卷)】堆内存申请(排序和贪心算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-堆内存申请二.解题思路三.题解代码Python题解代…...

Flink Watermark和时间语义

Flink 中的时间语义 时间语义&#xff1a; EventTime&#xff1a;事件创建时间&#xff1b;Ingestion Time&#xff1a;数据进入Flink的时间&#xff1b;Processing Time&#xff1a;执行操作算子的本地系统时间&#xff0c;与机器无关。不同的时间语义有不同的应用场合&#x…...

HarmonyOS UI框架简介

HarmonyOS UI框架介绍 HarmonyOSUI框架是一个用于构建跨设备应用的开发框架&#xff0c;它属于HarmonyOS系统架构的上层框架。该框架通过提供一系列的开发模型、声明式UI范式、系统API等&#xff0c;帮助开发者更高效地构建用户界面。 在HarmonyOSUI框架中&#xff0c;开发语…...

编程羔手解决Maven引入多个版本的依赖包,导致包冲突了

最近升级了些依赖发现有个hutool的方法老报错&#xff0c;java.lang.NoSuchMethodError: cn.hutool.core.util.ObjectUtil.defaultIfNull(Ljava/lang/Object;Ljava/util/function/Supplier;) 在 Maven 项目中&#xff0c;当不同的依赖模块引入 Hutool 的不同版本时&#xff0c…...

C#,入门教程(08)——基本数据类型及使用的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(07)——软件项目的源文件与目录结构https://blog.csdn.net/beijinghorn/article/details/124139947 数据类型用于指定数据体&#xff08;DataEntity&#xff0c;包括但不限于类或结构体的属性、变量、常量、函数返回值&#xff09;…...

分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机多特征分类预测

分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机多特征分类预测 目录 分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现DBO-SVM蜣螂算法优化支持向量机多特征分类预测&#xff08;完整…...

计算机二级Python选择题考点——公共基础部分

计算机完成一条指令所花费的时间称为一个指令周期。(指令周期越短&#xff0c;指令执行就越快)顺序程序不具有并发性。(具有顺序性、封闭性和可再现性)结构化程序设计强调程序的易读性。系统软件&#xff1a;操作系统、编译程序、数据库管理系统 应用软件&#xff1a;杀毒软件在…...

杭州手机网站制作电脑公司/seo关键词优化技术

用pytorch构造简单的线性模型 import torch# prepare dataset # x,y是矩阵&#xff0c;3行1列 也就是说总共有3个数据&#xff0c;每个数据只有1个特征 "先准备数据集&#xff0c;x_data, y_data" x_data torch.tensor([[1.0], [2.0], [3.0]]) y_data torch.tenso…...

红色 网站配色/竞价推广工具

singleInstance只能单独地位于一个任务栈中&#xff08;创建了一个新的水桶来盛放这一个任务栈&#xff0c;且新的水桶只能放一个任务栈&#xff09;&#xff0c;应用场景&#xff1a;来电话界面,及时来多个电话也只创建一个Activity;再如浏览器界面&#xff0c;输入多个网址访…...

it外包公司上海/杭州seo薪资水平

登录页面&#xff1a; 主页&#xff1a; 错误页面&#xff1a; 步骤流程示意图&#xff1a; 示例代码如下&#xff1a; 在登陆中异常的处理&#xff1a; package com.tarena.netctoss.dao;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.R…...

西宁网站建设电话/优化营商环境个人心得

提升程序员工作效率的工具/技巧推荐系列 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diagram Designer 介绍Windows任务管理器的替代者-Process Explorer 介绍一个强大的磁盘空间检测工具Space Sniffer 如何在电脑上比较两个相似文件…...

域名推荐网站/谷歌关键词搜索工具

/// /// 获取某一列的所有值/// /// 列数据类型/// 数据表/// 列名/// public static List GetColumnValues(DataTable dtSource,string filedName){return (from r in dtSource.AsEnumerable() select r.Field("ID")).ToList();}方法调用&#xff1a;获取字段ID的所…...

微积壹佰 网站建设/网络推广优化网站

微服务“Microservices”已经成为软件架构最流行的热词之一。网络上看到很多关于微服务的文章&#xff0c;但是感觉很多离我们还很遥远&#xff0c;并且没有找到多少真正在企业场景中应用的实例。此处省略一万字~~~~于是想要将自己最近一段时间使用微服务以及通过看大师们的文章…...