我对此并不完全确定,但我似乎正在观察焦点从一个控件自动转换到另一个控件的情况,即使在我明确地以编程方式将焦点设置为我想要集中控制的焦点之后。也许它与有问题的控件是一个面板有关,看起来WinForms比一个面板更专注于文本框。
嗯,首先,有人可以提供有关此问题的专家见解吗?而且,如果确实有可能在没有明确命令的情况下(无论是用户操作还是程序化)更改焦点,是否可以通过编程方式区分生成的Leave和Enter事件?也就是说,我想以编程方式抵消不是由我自己引起的Leave / Enter事件,但我仍然希望允许用户在GUI工作中正常更改焦点。
答案 0 :(得分:4)
是的,这可能发生。它可能是一个容器控件,它会搞砸你的焦点,Form就是从中衍生出来的。 ContainerControl在获取激活事件时寻找控件以进行聚焦。它喜欢嵌套的子控件,如果它有任何控件,它肯定会跳过你的面板。
WF处理焦点所涉及的逻辑非常复杂,最重要的是由于验证。你可以避免遇到麻烦,避免让专家小组成为焦点。它不是设计成可聚焦的控件,它无法向用户指示焦点。这是通过关闭ControlStyles.Selectable样式并将TabStop属性设置为false来强制执行的,因此用户无法通过Tab键或单击来对其进行聚焦。
Enter事件无效,Panel在获得焦点或其中一个子控件获得焦点时获得Enter。通过用户选项卡或使用Focus()方法。您必须等到所有焦点事件都完成后才能触发,您可以使用Control.BeginInvoke()或Timer进行操作。
嗯,我确信这没什么用,但你的问题描述很模糊。最好的方法是将展示此行为的示例项目发布到文件共享服务,或者如图所示,避免尝试为父控件提供焦点。
答案 1 :(得分:0)
要记住的一件事是许多winforms控件根本无法集中 - winforms提供了一个CanFocus属性来指示这一点。面板将CanFocus设置为false,因此无法使用将该属性设置为true的派生类直接关注面板。