【wpf】关于焦点

背景

今天踩了一个坑。我用到handycontrol中的一个密码控件PasswordBox

<hc:PasswordBox x:Name="pb" hc:TitleElement.Title="密码" hc:TitleElement.TitlePlacement="Left" Width="120"></hc:PasswordBox>

然后想实现一个回车输入密码登录的功能,主要目的就是只有当pb有焦点时候这个回车才实现登录功能:

 private void Window_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
 {

     if (e.Key == Key.Enter && pb.IsFocused)
     {
         Login();
     }
 }

然后发现,IsFocused不过怎么样都是false,后面换成了IsKeyboardFocused,也不行,最后换成IsKeyboardFocusWithin发现可以了。

焦点有哪些?

在 Windows Presentation Foundation (WPF) 中,焦点(Focus)主要分为以下几种:

  1. 键盘焦点(Keyboard Focus)

    • 键盘焦点指的是当前接受键盘输入的元素。通常通过按 Tab 键在可获得焦点的控件之间切换。只有一个元素可以拥有键盘焦点。
  2. 逻辑焦点(Logical Focus)

    • 逻辑焦点是指在某个特定焦点范围内(如一个窗口或一个焦点作用域)拥有焦点的元素。一个应用程序可以有多个焦点作用域,每个作用域中都有一个拥有逻辑焦点的元素。焦点作用域通常是由
      FocusManager.FocusedElement 属性来管理的。
  3. 鼠标捕获(Mouse Capture)

    • 鼠标捕获是指一个元素在捕获鼠标输入时,即使鼠标指针在该元素之外,也可以接收鼠标事件。鼠标捕获通常用于拖放操作。
  4. 触摸焦点(Touch Focus)

    • 触摸焦点指的是接受触摸输入的元素。在触摸设备上,当用户触摸某个控件时,该控件会获得触摸焦点。

总结:

  • 键盘焦点:当前接受键盘输入的元素。
  • 逻辑焦点:在某个焦点范围内拥有焦点的元素。
  • 鼠标捕获:捕获鼠标输入的元素。
  • 触摸焦点:接受触摸输入的元素。

每种焦点类型都有其特定的用途和应用场景,通过合理管理这些焦点类型,可以实现复杂的用户交互体验。

IsFocused 属于逻辑焦点。
IsKeyboardFocused 是键盘焦点。
IsKeyboardFocusWithin 指示元素或其子元素是否拥有键盘焦点。如果该元素或其任何子元素拥有键盘焦点,该属性返回 true。

如果键盘焦点是true 逻辑焦点是否必然为true

在 WPF 中,如果一个控件具有键盘焦点(IsKeyboardFocusedtrue),那么它也具有逻辑焦点(IsFocusedtrue)。换句话说,键盘焦点是逻辑焦点的一种特定情况。当一个控件获得键盘焦点时,它会自动获得逻辑焦点,但反过来则不一定成立。

逻辑焦点的作用是指在某个特定焦点范围内拥有焦点的元素,而键盘焦点是当前接收键盘输入的元素。每个应用程序只有一个键盘焦点,但可以有多个逻辑焦点。

什么情况下获取到逻辑焦点但没获取到键盘焦点

  • 逻辑焦点(logical focus)指的是用户操作的当前位置或对象,通常通过鼠标点击或其他非键盘输入设备来设置。例如,在一个网页表单中,用户可以通过点击不同的输入字段来设置逻辑焦点,这样他们可以在该字段中输入文本。

  • 键盘焦点(keyboard focus)则是指当前接收键盘输入的对象或位置。这通常是由用户按下Tab键或其他键盘导航键来切换的,例如在一个表单中,用户可以通过按Tab键来移动键盘焦点到下一个输入字段。

所以,情况下获取到逻辑焦点但没获取到键盘焦点可能是因为用户通过鼠标或其他非键盘输入设备设置了逻辑焦点,但键盘焦点仍然停留在先前的对象或位置上,可能是因为用户尚未使用键盘导航键来改变键盘焦点位置。

逻辑焦点有什么应用吗?

逻辑焦点在用户界面设计中有着重要的应用,它可以帮助用户更有效地与应用程序或网站进行交互。以下是逻辑焦点的一些常见应用:

  1. 表单输入:在表单中,逻辑焦点可以帮助用户明确当前正在输入的字段,提高输入效率。用户可以通过点击或通过其他手势设备选择要输入的字段,并且可以通过视觉指示(例如突出显示或光标位置)来显示逻辑焦点所在的位置。

  2. 导航菜单:网站或应用程序中的导航菜单通常使用逻辑焦点来确定当前选定的菜单项。这样,用户可以清楚地知道他们在导航中的位置,并且可以使用键盘或其他输入设备来更改所选菜单项。

  3. 交互式元素:在交互式元素(如按钮、链接、复选框等)中,逻辑焦点可以用于确定用户当前的操作目标。这对于通过键盘进行导航和操作的用户尤其重要。

  4. 可访问性:逻辑焦点在可访问性方面也很重要,因为它可以帮助视觉障碍用户或只能使用键盘进行导航的用户明确了解他们当前的位置,并且可以通过键盘输入与所需元素进行交互。

总的来说,逻辑焦点通过明确用户当前的操作目标,提高了用户界面的可用性和可访问性,使用户能够更轻松地与应用程序或网站进行交互。

逻辑焦点的作用域

<Window x:Class="FocusExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Focus Example" Height="200" Width="300">
    <StackPanel>
        <GroupBox Header="Group 1" FocusManager.IsFocusScope="True">
            <StackPanel>
                <TextBox Name="textBox1" Width="200" Height="30" Margin="5"/>
                <Button Content="Button 1" Margin="5"/>
            </StackPanel>
        </GroupBox>
        <GroupBox Header="Group 2" FocusManager.IsFocusScope="True">
            <StackPanel>
                <TextBox Name="textBox2" Width="200" Height="30" Margin="5"/>
                <Button Content="Button 2" Margin="5"/>
            </StackPanel>
        </GroupBox>
    </StackPanel>
</Window>

这个以后再看吧~~~~~~

小结

这应该是handycontrol的PasswordBox 一个bug吧,
最终 用 IsKeyboardFocusWithin 解决问题。

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code bean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值