【问题标题】:Is it possible to avoid Focus on SplitContainer?是否可以避免专注于拆分容器?
【发布时间】:2009-07-23 13:26:31
【问题描述】:

WinForm SplitContainer 在拖动或单击时获得焦点,而 Splitter 则没有。 这样做的副作用是拖动 SplitContainer 栏会在其他控件上触发 Leave/Validate,我需要避免这种情况。

我已经尝试将 TabStop 和 CausesValidation 设置为 False,但没有成功。

有没有办法阻止 SplitContainer 获得焦点? (没什么大不了的,我仍然可以使用旧的 Splitter,但我失去了一些不错的 VS 属性......)

【问题讨论】:

  • 也许你可以抓住它获得焦点的事件。记住之前聚焦的对象,然后将注意力重新放在 MouseUp 上。 TabStop 将负责键盘部分。

标签: winforms focus splitcontainer


【解决方案1】:

移除 SplitContainer 控件并手动将其替换为 Panel 和 Splitter 控件。多一点努力,但结果要干净得多。

【讨论】:

    【解决方案2】:

    试试这个代码:

    //This code will move the focus from the splitContainer to TreeView shortly after moved.
    private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e) {
        if(this.splitContainer1.CanFocus) {
           this.splitContainer1.ActiveControl = this.treeView1;
        }
    }
    

    【讨论】:

      【解决方案3】:

      菲利尼,

      splitcontainer 唯一具有焦点的时间是当您实际移动拆分器时。所以我会在你的验证和离开事件中这样做。

      private void Button_Leave(object sender, EventArgs e)
      {
          if(SplitContainer.ContainsFocus)
              return;
      }
      

      我重现了您的问题,当我添加上面的内容时,它当然仍然调用事件,但是代码执行不会发生,因为在您移动拆分器时 SplitContainer 具有焦点。

      希望对您有所帮助。

      【讨论】:

      • 不幸的是,这对我们的架构来说并不好。我有一个使用标准验证事件进行验证的用户控件,我无法更改其行为,因为其他外部控件出现故障(这就是问题所在,当您移动拆分容器栏时,将触发离开/验证事件,但焦点仍然在栏,并且我的用户控件由于某种原因冻结)。让我烦恼的是,普通的分离器不会发生这种情况,它会在没有获得焦点的情况下移动。最终,我想我会使用分离器
      • 我已经尝试过,但无法复制焦点留在栏上的行为。在我所有的尝试中,焦点立即返回到在单击拆分器之前具有焦点的控件。抱歉,我无法提供帮助。
      • 即使它有效(但我认为 Validating 无论如何都会触发),我必须将此代码放入我所有的 Details UserControls(大约 15 个)中。这是不可管理的。我希望找到一个解决方案,将一些代码放在 SplitContainer 中,而不是放在其他控件中。无论如何谢谢:)
      • 拥有焦点触发器验证是一个糟糕的设计。
      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 2018-10-04
      相关资源
      最近更新 更多