2010-03-06 108 views

回答

2

的一種方法是改變分配器的BackColorWidth/Height性質(取決於分路器的方向)

1

除了使得其邊框Fixed3D作爲@BlueMonkMN建議我經常發現splitContainer對象的默認SplitterWidth值爲4,有點窄。

如果你把它增加到6,用3D邊框,對用戶來說就更加明顯了。

14

您可以通過將以下事件處理程序添加到splitcontainer繪畫事件來繪製您自己的分隔欄。

private void SplitterPaint(object sender, PaintEventArgs e) 
{ 
    SplitContainer s = sender as SplitContainer; 
    if (s != null) { 
     int top = 5; 
     int bottom = s.Height - 5; 
     int left = s.SplitterDistance; 
     int right = left + s.SplitterWidth - 1; 
     e.Graphics.DrawLine(Pens.Silver, left, top, left, bottom); 
     e.Graphics.DrawLine(Pens.Silver, right, top, right, bottom); 
    } 
} 
+1

這適用於分離器垂直取向時,代碼可以改進爲無論方向如何工作。 – 2012-05-02 11:02:47

+0

是的,它可以簡化爲:'e.Graphics.FillRectangle(Brushes.LightGray,s.SplitterRectangle);' – Brett 2017-06-13 20:29:05

0

賈爾斯巴斯蓋特的回答改進型:

private void ds_SplitContainer_Paint(object sender, PaintEventArgs e) 
{ 
    SplitContainer l_SplitContainer = sender as SplitContainer; 

    if (l_SplitContainer != null) 
    { 
     Rectangle ll_ShrinkedSplitterRectangle = l_SplitContainer.SplitterRectangle; 
     ll_ShrinkedSplitterRectangle.Offset(0, 2); 
     ll_ShrinkedSplitterRectangle.Height = ll_ShrinkedSplitterRectangle.Height - 2; 
     e.Graphics.FillRectangle(Brushes.Silver, ll_ShrinkedSplitterRectangle); 
    } 
} 
34

這個問題的出現是由於SplitContainer控制具有設置可拖動分割條本身的樣式,沒有直接的財產

有幾種方法可以做到這一點,即使這裏發佈的其他答案有效,下面與我分享的答案最終也是快速,可靠和最簡單的方法。

@BluMonkMN建議使用3D邊框的方法,但如果您不想要任何邊框?

@Giles Bathgate建議添加一個Paint事件處理程序,儘管它確實很優雅並且可以工作,但它的性能成本很低,需要您向C#級別執行的項目添加更多代碼,並且可能有一天會成爲維護問題。

@Philip Fourie建議更改SplitContainer.BackColor屬性值;然而,最初導致控件的整個背景改變顏色,而不僅僅是分隔條,導致沒有顏色對比。

所以,我的解決方案是@Philip Fourie的增強。

首先,我會提及的是,SplitContainer實際上有兩個不同的子容器,它們都被分隔條隔開。這兩個屬性由Panel1Panel2屬性表示。除了其他幾個屬性外,它們中的每一個本質上都是一個具有自己的BackColor屬性的Panel容器。

SplitContainer它的自己BackColor財產,使共有三種獨特的可能顏色。

現在,如果你要設置這個SplitContainer.BackColor屬性,則Panel1Panel2「子控件」將自動繼承顏色值,而現在他們全是一樣的,沒有造成視覺反差!當Panel1.BackColor和/或Panel2.BackColor屬性有尚未明確由您定
這[可能不受歡迎]屬性值繼承只發生(儘管在未來的時間Visual Studio的屬性窗口中查看其屬性值就會顯露「控制」)

因此,您所設置的屬性的順序很重要:

  1. 同時設置了「孩子」 Panel1.BackColorPanel2.BackColor屬性,其他的東西比「精讀的默認值trol「強制一個明確的值(即使你真的想要」控制「;我們稍後會修復。)
  2. 將「父」SplitContainer.BackColor設置爲您希望分隔條所需的顏色。
  3. 最後,返回並設置Panel1.BackColorPanel2.BackColor屬性,你希望他們爲彩色(也許回「控制」。)

而作爲@Philip福裏回答,您不妨設置Width屬性,實際上是統一進行命名SplitterWidth,無論的[水平與垂直] Orientation財產。

下面是一些有用的提示:

雖然在Visual Studio窗體設計器的工作,如果你在SplitContainer點擊分隔欄的兩側,你會選擇那Panel1Panel2「孩子」子容器。但是,如果您單擊分隔欄本身,您將選擇「父」SplitContainer

與@Stuart Helwig建議的相關,默認SplitterWidth將導致分隔欄在其焦點處被勾勒出來,從而模糊了您選擇的顏色。將值提高到5,6或更高,這也使得最終用戶更容易抓取拖動。

完成。快樂編碼!

+3

哦。創意,簡單。我喜歡! – Nyerguds 2014-07-29 08:08:24

+0

這應該是正確的答案,尤其是因爲它允許更改分離器的顏色。儘管答案有多長(由於提供了更多細節),但使用此方法更改顏色也非常容易。 – elmer007 2016-02-19 21:16:24

0

這是一個快速實現的水平分割器,它填充了一種顏色,有一個頂部和底部邊界(類似於Visual Studio分割器),中間是抓手點。

private void splitContainer_Paint(object sender, PaintEventArgs e) 
    { 
     SplitContainer s = sender as SplitContainer; 
     if (s != null) 
     { 
      int gripLineWidth = 9; 
      // Fill Splitter rectangle 
      e.Graphics.FillRectangle(SystemBrushes.ControlDark, 
       s.SplitterRectangle.X, s.SplitterDistance, s.SplitterRectangle.Width, s.SplitterWidth); 
      // Draw Single Line Border on Top and Bottom 
      e.Graphics.DrawLine(Pens.LightSlateGray, 
       s.SplitterRectangle.X, s.SplitterDistance, s.SplitterRectangle.Width, s.SplitterDistance); 
      e.Graphics.DrawLine(Pens.LightSlateGray, 
       s.SplitterRectangle.X, s.SplitterDistance + s.SplitterWidth - 1, s.SplitterRectangle.Width, s.SplitterDistance + s.SplitterWidth - 1); 
      // Draw gripper dots in center 
      e.Graphics.DrawLine(_dashedPen, 
       ((s.SplitterRectangle.Width/2) - (gripLineWidth/2)), 
       s.SplitterDistance + s.SplitterWidth/2, 
       ((s.SplitterRectangle.Width/2) + (gripLineWidth/2)), 
       s.SplitterDistance + s.SplitterWidth/2); 
     } 
    } 

您可以創建一個筆在類執行,這將在類似於畫虛線繪製一個成員變量:

private static Pen _dashedPen = new Pen(Color.DarkRed, 1); 
_dashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; 
+0

您是否可以包含初始化虛線筆的代碼? – 2017-04-24 21:34:34

0

設置SplitContainerBackColor屬性不同顏色。讓我們說黑色。然後每個SpliterPanel,將其BackColor屬性更改爲不同的顏色。說白了。然後你會注意到SplitLine會變得更加明顯。 :)

+0

這與GlobalSoftwareSociety的回答相同 – TheLethalCoder 2016-02-08 11:32:11

-1

分隔線實際上是可見的。真正的問題是很難區分與其他控制。

一個想法是爲拆分容器設置新的背景色,並使其與子面板不同。

也許有時我們可以從設計者的角度解決問題,而不是開發人員的問題。 :-)

+0

這與GlobalSoftwareSociety的回答相同 – TheLethalCoder 2016-02-08 11:31:34

2

您可以在設計器中使用SplitterColor來更改分隔線邊框顏色。

public class SplitContainerCustomSplitter : SplitContainer 
{ 
    [DefaultValue(typeof(Color), "Black")] 
    public Color SplitterColor { get; set; } = Color.Black; 

    protected override void OnPaint(PaintEventArgs pevent) 
    { 
     Graphics g = pevent.Graphics; 
     Rectangle rect = SplitterRectangle; 

     using (Pen pen = new Pen(SplitterColor)) 
     { 
      if (Orientation == Orientation.Vertical) 
      { 
       g.DrawLine(pen, rect.Left, rect.Top, rect.Left, rect.Bottom - 1); 
       g.DrawLine(pen, rect.Right - 1, rect.Top, rect.Right - 1, rect.Bottom - 1); 
      } 
      else 
      { 
       g.DrawLine(pen, rect.Left, rect.Top, rect.Right - 1, rect.Top); 
       g.DrawLine(pen, rect.Left, rect.Bottom - 1, rect.Right, rect.Bottom - 1); 
      } 
     } 
    } 
} 
0

嘗試一些在這裏,而不是建議會哄我的方法後,我決定把在PANEL1和是Panel2薄的標籤,對齊到分離器,一切都OK。

(label's.Autosize=false, label's.Text = "", label's.Color=SystemColor.Selected, label1.Dock=left; label2.Dock=right)