2012-03-14 98 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