【问题标题】:Setting focus to previous control将焦点设置到上一个控件
【发布时间】:2016-10-22 14:25:36
【问题描述】:

我遇到了一个拆分器面板失去控制的问题,需要重新设置它。

我的应用程序使用 SplitContainer;并且当我的控件在拆分器的 panel2 中加载数据时,焦点正在转移到 panel1。

两个面板中都有 tabStop = true 的控件,因为 tab 和 shift+tab 需要同时在面板和拆分器上工作。

要重新设置它,在 GotFocus 中为 panel2 控件添加了一个 Control 对象,并在 panel1 的 _enter 中使用它来将焦点重新设置在 panel2 中。但是,我需要重置这个控制对象;我不能在 panel2 的 _leave 中执行此操作,因为在设置回控制时 GotFocus 将被再次调用。

【问题讨论】:

    标签: c# winforms focus splitcontainer


    【解决方案1】:

    我认为您应该实现这些行为的状态管理以同步控件的事件。例如,您可能会使用一些与控件对象的状态相关的标志,然后在 GotFocus 事件中通过一些测试来验证它们的值...



    在 cmets 进行一些清理后更新..

    在Msdn上关于控件的焦点相关事件,你发现“Enter”事件总是事件链中的第一个,第二个总是“GotFocus”。见:https://msdn.microsoft.com/it-it/library/system.windows.forms.control.gotfocus(v=vs.110).aspx

    您可以在“Enter”事件中评估控件焦点状态变量并在“GotFocus”事件中分配它,从而避免在离开事件中重置任何内容。

    通过这种方式,您应该始终了解每个控件的“Enter”处理程序中的前一个控件(您可以对所有控件使用相同的处理程序)并提出您的要求..

    如果您需要在多个面板中管理一些拆分控件,您还可以实现一个字典,将每个面板映射到控件的焦点,因此如果您从一个面板切换到另一个面板,您可能总是知道该面板的最后一个控件有焦点。

    【讨论】:

    • 我尝试在 _gotfocus 中将标志设置为 true,在控件 A 的 _Leave 中设置为 false,但我需要在控件 B 的 _enter 中将此值设置为 true。这样应用程序可以设置焦点如果先前的控件是 A,则返回 A。但我不能让该值保持为 false,因为 B 应该使用 tab 和 shift+tab 设置焦点。然后我尝试在控制 B 的离开中将其设置为 false,但由于我正在执行 .Focus() 来控制 A,因此此标志每次都会重置为 true。
    • 我确实通过并尝试了stackoverflow.com/questions/4428100/… 和stackoverflow.com/questions/4408751/… 中提供的解决方案
    • 我误解了你的意思。我认为模块级范围控制变量是解决你问题的好方法
    • 您能详细说明一下吗?我怎样才能有选择地设置以前的集中控制呢?我使用的变量是在项目级别,所以我可以在控件 A 的 gotfocus() 中设置它,在控件 B 的 enter() 中使用,然后在控件 A 的 leave() 中重置。但这就是将我的变量设置回 gotfous()离开()之后。
    • 我指的是您在我赞成的评论中所说的解决方案的链接。但是,看到更好的问题,在我看来,您想从控件切换通过制表符切换到另一个,然后通过切换制表符返回,您需要保存有关哪个控件是最后一个焦点的信息。我在答案中回复
    【解决方案2】:

    我尝试了多种解决方案,最安全的选项似乎是在 panel2 中的控件获得焦点时关闭 panel1 控件上的选项卡控件,并在离开焦点时将其重新打开。这可确保应用程序焦点不会转移到 panel1。这也将确保我的控件适用于 tabbing 和 shift_tabbing。在 panel2 中将焦点强制设置回控制会触发 gotfocus() 多次,这是在排便目的

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2011-03-21
      • 2011-10-26
      • 1970-01-01
      • 2014-01-21
      相关资源
      最近更新 更多