2012-03-14 32 views
3

如何禁用SplitContainer上的焦点提示? 我问,因为我宁愿使用OnPaint自己绘制它们,以使其看起来更平滑。在SplitContainer上禁用焦点提示

我尝试这样做:

protected override bool ShowFocusCues 
    { 
     get 
     { 
      return false; 
     } 
    } 

这是我的控制:

public class cSplitContainer : SplitContainer 
    { 
     private bool IsDragging; 

     protected override void OnMouseDown(MouseEventArgs e) 
     { 
      base.OnMouseDown(e); 
      if (!IsSplitterFixed) IsDragging = true; 
      Invalidate(); 
     } 
     protected override void OnMouseUp(MouseEventArgs e) 
     { 
      base.OnMouseUp(e); 
      if (IsDragging) 
      { 
       IsDragging = false; 
       IsSplitterFixed = false; 
      } 
     } 
     protected override void OnMouseMove(MouseEventArgs e) 
     { 
      base.OnMouseMove(e); 
      if (IsDragging) 
      { 
       IsSplitterFixed = true; 
       if (e.Button == MouseButtons.Left) 
       { 
        if (Orientation == Orientation.Vertical) 
        { 
         if (e.X > 0 && e.X < Width) SplitterDistance = e.X; 
        } 
        else 
        { 
         if (e.Y > 0 && e.Y < Height) SplitterDistance = e.Y; 
        } 
       } 
       else 
       { 
        IsDragging = false; 
        IsSplitterFixed = false; 
       } 
      } 
     } 
     protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
     { 
      base.OnPaint(e); 
      if (IsDragging) 
      { 
       e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(127, 0, 0, 0)), Orientation == Orientation.Horizontal ? new Rectangle(0, SplitterDistance, Width, SplitterWidth) : new Rectangle(SplitterDistance, 0, SplitterWidth, Height)); 
      } 
     } 
    } 

,但没有奏效。我也尝试过之前提到的其他一些方法,但我仍然得到了重点线索。

回答

4

SplitContainer的的代码是这样的:

protected override void OnPaint(PaintEventArgs e) { 
    base.OnPaint(e); 
    if (Focused) { 
    DrawFocus(e.Graphics,SplitterRectangle); 
    } 
} 

DRAWFOCUS不是虚拟的。所以你不能重写它。
集中是虚拟的。也许你可以将它设置为false,同时在OnPaint重写中调用base.OnPaint(...)

所以,你可以添加以下代码(如果它的作品我没有测试过):

private bool _painting; 
public override bool Focused 
{ 
    get { return _painting ? false : base.Focused; } 
} 

protected override void OnPaint(PaintEventArgs e) 
{ 
    _painting = true; 

    try 
    { 
    base.OnPaint(e); 
    } 
    finally 
    { 
    _painting = false; 
    } 
} 

这比一个干净的解决方案更多的是黑客。

+0

将'DrawSplitHelper'标记为'private void'太糟糕了。我猜测OP对他们正在使用的HalfToneBrush并不满意。 – LarsTech 2012-03-14 19:19:45

+0

它仍然无法正常工作。完成拖动时会显示两次提示。你有没有试过我的代码? – bytecode77 2012-03-14 20:13:25

+0

@Devilschild我测试了它,它只有一点帮助。当您关注分隔栏时,它会显示线索。如果控件失去焦点(例如通过选择另一个应用程序的窗口并再次获得焦点:那么它将不会显示任何线索。 – brgerner 2012-03-15 10:16:08

0

这是一种类似的问题,在stackoveflow上被问到一个解决方案是否被你用来使用,还有重写showfocuscues属性,你也需要重写paint方法。

6

我不需要认为您看到的是FocusCue,就像用于移动滑块的浮动窗口一样。

如果键盘访问并不重要,你可以尝试使其成为不可选择:

public class MySplit : SplitContainer { 

    public MySplit() { 
    this.SetStyle(ControlStyles.Selectable, false); 
    } 

    protected override void OnPaint(PaintEventArgs e) { 
    e.Graphics.Clear(Color.Red); 
    } 
} 

这可以防止SplitContainer中从得到的焦点,但你的鼠标仍然可以与它进行交互。

+1

请注意,您调整在第一时间仍有线索visible.Add这完全地消除它:保护覆盖无效OnGotFocus(EventArgs的五){ // 没有 } – Thomas 2016-07-25 14:34:27

2

简单的解决方案:收到它时立即放弃焦点!

三个步骤:

  1. SplitContainer
  2. 正向创建一个GotFocus处理重点与AnotherControl.Focus()另一个控制。
  3. 设置TabStopFalse

这就是全部。丑陋的焦点提示从未被显示。

现在,一个微妙之处:哪个其他控件将重点放在?随你便。只需按Tab键顺序选择第一个控件,或者在SplitContainer的右窗格(下面的ASCII图中的TextBox)中选择左上方的可调焦控件。完美的解决方案将是以前的焦点控制,但遗憾的是这并不容易找到:Find out the control with last focus,但恕我直言,左上方可调焦控制是一个非常好的响应。

 left pane   right pane 
------------------------------------------------ 
:      ::      : 
:      :: [TextBox] [Button] : 
:      ::      : 
:      :: [Combobox V]  : 
:      ::      : 
------------------------------------------------ 
+1

找出最后关注的子控件的确很棘手! GotFocus事件异步触发,所以最初给定焦点的子控件的GotFocus事件在某些情况下可能会在SplitContainer本身的GotFocus事件之后触发。 – 2015-07-07 20:45:13

3

我是谷歌搜索这个问题,这个问题出现在顶部。

有一个解决方案和有趣的讨论on a Microsoft forum regarding the splitter stealing focus for no good reason。下面的评论是点上:


你提到的重点问题是由设计,但得到你想要的,你可以使用以下解决方法的表现:....


它可能是“按设计”,但它不是一个很好的。在任何微软生产应用程序中,你曾经见过哪些喋血记者,他们甚至暂时把焦点从他们分裂的窗格中分离出来?我还添加了你建议的代码,它确实使我永远不会将注意力集中在分离器上,但我仍然不喜欢我的窗格在分离器操作过程中隐藏和显示它们的选择。

这种分散注意力的选择闪光只是不存在于大多数专业应用程序。这足够好,它可能不值得花时间修复一段时间,但不是大多数人真正想要的。如果您尊重TabStop属性或甚至添加了AcceptsFocus属性,则大多数人会希望关闭它。我认为你应该在未来的版本中增加这个选项。

--Brendan