WPF:无法控制键盘焦点

2024-04-24

这周我遇到了一个让我陷入困境的问题。总而言之,问题是当我左键单击另一个控件时,我无法从代码中将键盘焦点赋予 ComboBox。

具体来说,我有一个 CustomControll,它有一个 Scrollview,其中包含另一个 CustomControll,还有另一个带有 ComboBox 作为子项的 CustomControll。我将举例说明这一点以使其清楚:

  • ScrollView
    • DayView (CustomControl)
      • ScrollView
        • Some irrelevvant controls
          • 时间线事件(自定义控件)
    • EventEditor (CustomControl)
      • ComboBox

我想做的是,当用户左键单击或以其他方式选择 TimelineEvent(例如通过创建它)时,通过调用 Keyboard.Focus(myComboBox) 将键盘焦点赋予 ComboBox。当我第一次点击 LMB 时,TimelineEvent 就获得了键盘焦点。第二次单击时,DayView 的父级获得焦点(它是滚动视图)

我无法解释这种行为。我在代码中设置了断点并确保它被执行。我还添加了 OnLostKeyboardFocus、OnGotKeyboardFocus 的侦听器及其对 TImelineEvent、包含它的 ScollView 和组合框的预览。我已经让它将一些日志打印到控制台,这就是我得到的:

[First LMB down on TimelineEvent]
System.Windows.Controls.ScrollViewer got focus
[LMB up]
EDP.EDPTid.CustomControlLibrary.TimelineColumn.TimelineEvent lost focus
EDP.EDPTid.CustomControlLibrary.TimelineColumn.TimelineEvent got focus
The thread '<No Name>' (0x19bc) has exited with code 0 (0x0).
[Second LMB down on the same element]
System.Windows.Controls.ScrollViewer lost focus
System.Windows.Controls.ScrollViewer got focus
[LMB Up]
EDP.EDPTid.CustomControlLibrary.TimelineColumn.TimelineEvent lost focus
EDP.EDPTid.CustomControlLibrary.TimelineColumn.TimelineEvent got focus
System.Windows.Controls.ComboBox Items.Count:29 lost focus
System.Windows.Controls.ComboBox Items.Count:29 got focus

在最后两行,您可以看到 ComboBox 似乎获得了键盘焦点,但是当我按下按键时,很明显它是最上面的滚动视图获得了键盘焦点,我也使用 Snoop 确认了这一点。

以下是在 TimelineEvent.MouseLeftButtonUp 上执行的代码:

public class DayView
{
...
    public void SelectEvent(TimelineEvent sender, bool useSpecialFocus)
    {
        EventEditor.EditedEvent = null;
        HideControl(EventEditor);

        foreach (TimelineEvent evnt in Timeline.EventContainer.GetEvents())
        {
            if (sender != null && evnt.Data.Id == sender.Data.Id)
            {
                EventEditor.EditedEvent = sender;
                ShowControl(EventEditor);

                evnt.MarkAsSelected(true);
                if (evnt.IsMouseOver)
                {
                    evnt.ShowButtons();
                }
                Expand();

                Keyboard.Focus(EventEditor.EventType);
            }
            else
            {
                evnt.MarkAsSelected(false);
                evnt.HideButtons();
            }
        }
    }

    private void HideControl(FrameworkElement control)
    {
        animator.AnimateOpacity(control.Opacity, 0.0d, new TimeSpan(0, 0, 0, 0, 100), false, control, Visibility.Hidden);
    }

    private void ShowControl(FrameworkElement control)
    {
        animator.AnimateOpacity(control.Opacity, 1.0d, new TimeSpan(0, 0, 0, 0, 100), false, control,Visibility.Visible);
        control.Visibility = Visibility.Visible;
    }
}

public class TimelineEvent
{
    ...
    public void MarkAsSelected(bool selected, bool useSpecialFocus)
    {
        if (SelectedBorder != null)
        {
            SelectedBorder.BorderThickness = new Thickness(selected ? 2 : 0);
            IsSelected = selected;

            Focus();                        
        }
    }
}

您可能会注意到的一件事是,我首先调用了 TimelineEvent.Focus(),然后调用 Keyboard.Focus(EventEditor.EventType)。我认为这可能是我的问题的原因,所以我评论了对 Focus out 的调用,它是遗留代码,并不是真正需要的。应用程序开始表现得非常不稳定——大多数仍在 SelectEvent 函数中执行的代码停止工作! EventEditor 没有变得可见,TimelineEvent 没有获得大小为 2 的边框,并且焦点被赋予了源自ExternalCode 的时间轴事件的 Scrollview 父级,因此我无法跟踪调用。

我已经被这个问题困扰了两天,没有获得任何见解,任何帮助将不胜感激。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF:无法控制键盘焦点 的相关文章

随机推荐

  • 如何在表视图或集合视图中实现无限加载?

    我正在构建一个文章阅读应用程序 我从 JSON 链接获取数据 例如 uitableview 中的文章图像和标题 我无法在 uitableview 中实现分页 假设我的 JSON 链接是 www example com page 1 一次包含
  • 使用 Node 解析 XLSX 并创建 json

    好的 我发现这确实有很好的记录node module called js xlsx https github com SheetJS js xlsx 问题 我怎么能够解析 xlsx 以输出 json Excel 工作表如下所示 最后 jso
  • 为什么我的 .NET Core 解决方案的包含文件夹中没有任何包文件夹?

    包现在是否缓存在某个更共享的位置或什么地方 我的解决方案文件夹没有任何packages folder 每个项目 References gt Nuget 指示引用和恢复哪些包 但是 正如 Eastrall 提到的 packages 文件夹现在
  • java.util.Properties 字段的 Spring JavaConfig

    您能告诉我如何使用 Spring Javaconfig 直接将属性文件加载 自动装配到 java util Properties 字段吗 Thanks 稍后编辑 仍在寻找答案 是否可以使用 Spring JavaConfig 将属性文件直接
  • PHPMailer 和 Gmail 对话视图

    当我们的服务器收到更新 通常与付款相关 时 我使用 PHPMailer 发送电子邮件以提供支持 我正在尝试将相关电子邮件显示为 Gmail 对话 以便支持人员更轻松地跟踪之前的更新 回复 我最初认为它是基于主题的 但这似乎没有什么区别 我的
  • 使用 setTimeout 和 Jest 测试 Promise

    我试图理解 Jest 的异步测试 我的模块有一个函数 它接受布尔值并返回值的 Promise 执行器函数调用setTimeout 并且在超时回调中 promise 会根据最初提供的布尔值进行解析或拒绝 代码如下所示 const withPr
  • 当应用程序在后台时使用 uni_links

    我的应用程序具有以下结构 InheritedWidget for dependencies gt Splash Screen Page gt Login Pages gt Main Pages 当应用程序第一次运行时 我可以使用var li
  • 使用流浪文件回答提示?

    是否可以将脚本添加到 Vagrantfile 来回答提示 我正在为 docker 配置一个 ubuntu 盒子 config vm box ubuntu config vm provision shell inline gt sudo ap
  • 更改浏览器选项卡会意外触发焦点事件,尤其是在 Google Chrome 中

    我刚刚意识到焦点事件有一个小问题 显然 当切换到另一个浏览器选项卡然后再次返回时 焦点会被触发 我宁愿不要这样的事情发生 是否可以 直到今天我才意识到这一点 这是一个小演示 http jsfiddle net MJ6qb 1 http js
  • XmlReader AppendChild 未附加相同的子值

    XmlElement updateRecipient doc CreateElement UpdateRecipient XmlElement email doc CreateElement EMAIL XmlElement listID
  • 是否有适用于 IE6 的 JavaScript PNG 修复程序允许 CSS 背景定位?

    我已经看到了一些允许 PNG 图像在 Internet Explorer 6 中具有透明度的修复 但我还没有找到一个也允许您在 CSS 中设置背景位置的修复 如果你使用精灵 那就会破坏交易 我求助于使用 GIF 质量不高 根本不使用透明图像
  • Django QuerySet 何时被评估?

    我读过 django 查询集是懒惰的 但这是否意味着懒惰 因为我可以在一个语句上链接多个操作 或者懒惰 因为查询被延迟到需要结果的时候 例如 以下模拟代码是否执行两个或三个 SQL 查询 query Books objects filter
  • StreamWriter.Flush() 和 StreamWriter.Close() 有什么区别?

    两者在功能上有什么区别StreamWriter Flush and StreamWriter Close 当我的数据没有正确写入文件时 我添加了两个Flush and Close 到我的代码的末尾 然而 我意识到添加either Flush
  • 具有来自包含器类的静态方法调用的 Ruby 模块

    我需要在模块中定义使用包含该模块的类中的方法的常量 module B def self included base class lt lt base CONST self find end end end class A def self
  • 如何确保以编程方式发送的电子邮件不会被自动标记为垃圾邮件?

    这是一个棘手的问题 我一直依赖技术 例如基于许可的电子邮件 即仅发送给您有权发送的人 而不是公然使用spamish术语 最近 我以编程方式发送的一些电子邮件开始被自动混入人们的垃圾邮件文件夹中 我想知道我能对此做些什么 尽管这些特定的电子邮
  • 为什么空 python 正则表达式搜索的返回值是匹配的?

    将空字符串传递给正则表达式对象时 搜索结果是匹配对象而不是 None 因为没有任何东西可以匹配 所以它应该是 None 吗 import re m re search some text if m is None print Returne
  • 从新线程更新 JProgressBar

    如何从另一个线程更新 JProgressBar setValue int 我的第二个目标是用尽可能少的课程来完成它 这是我现在的代码 Part of the main class pp addActionListener new Actio
  • 在 F# 中组合谓词

    F 中是否有逻辑组合谓词的标准方法 例如 假设我有isCar x and isBlue x然后我想要一些能给我的东西 let isBlueCar x isCar x isBlue x 但是使用某种组合而不是调用 可能像 let isBlue
  • 扫描大量BLE标签

    我一直在寻找在一次扫描中扫描大量 BLE 标签 StickNFind 的可能性 我注意到 当我扫描 10 秒时 我可以轻松检测到大约 20 个 BLE 当我将扫描间隔增加到 30 秒左右并尝试扫描大量 BLE 标签时 例如200 个标签 我
  • WPF:无法控制键盘焦点

    这周我遇到了一个让我陷入困境的问题 总而言之 问题是当我左键单击另一个控件时 我无法从代码中将键盘焦点赋予 ComboBox 具体来说 我有一个 CustomControll 它有一个 Scrollview 其中包含另一个 CustomCo