WinForms:SplitContainer的替代品?

时间:2010-04-23 19:47:52

标签: c# .net winforms splitter splitcontainer

是否有人可以建议替换WinForms SplitContainer的替代控件?我不喜欢SplitContainer在选中它和被拖动时如何显示奇怪的虚线条。我想让面板重新调整大小,因为用户拖动而不是鼠标向上,并且在拖动分割器时不显示任何虚线条。基本上就像在Vista浏览器中完成面板的所有重新调整大小一样。

这是我正在谈论的虚线:

splitter

5 个答案:

答案 0 :(得分:9)

编写自己的拆分容器UserControl。您基本上只需将两个面板放到控件上(对于左侧和右侧面板),然后让它们之间的空间成为分割器。 UserControl本身上的一个小MouseDown,MouseMove和MouseUp逻辑将让您轻松地左右移动“拆分器”,两个面板将在分配器上的任何地方正确阻止,因此您的逻辑用于检查鼠标是否超过拆分器尽可能简单。

让控制按照您希望它在设计模式下的行为方式行动可能需要一些额外的工作。

答案 1 :(得分:5)

我在看到你的问题后发现了这个,所以我想分享一下: SplitContainer FAQ

那里的第二个链接确切地说明了你需要做什么。

以下是链接永远消失的文字。

//1.  Use the custom control defined in the SplitContainerNoFocus sample
//2. Insert the following code in your project, and attach these events to all of the SplitContainers that you don't want stealing focus.

// Temp variable to store a previously focused control
private Control focused = null; 

private void splitContainer_MouseDown(object sender, MouseEventArgs e)
{
   // Get the focused control before the splitter is focused
   focused = getFocused(this.Controls);
}

private Control getFocused(Control.ControlCollection controls)
{
   foreach (Control c in controls)
   {
      if (c.Focused)
      {
         // Return the focused control
         return c;
      }
      else if (c.ContainsFocus)
      {
         // If the focus is contained inside a control's children
         // return the child
         return getFocused(c.Controls);
      }
   }
   // No control on the form has focus
   return null;
}

private void splitContainer_MouseUp(object sender, MouseEventArgs e)
{
   // If a previous control had focus
   if (focused != null)
   {
      // Return focus and clear the temp variable for 
      // garbage collection
      focused.Focus();
      focused = null;
   }
}

答案 2 :(得分:1)

你根本无法修改SplitContainer。一种可能性是,如果您仅使用它来调整控件的大小,则完全消除它。您可以在控件本身上使用鼠标事件。在表单上删除TreeView并将其停靠在左侧。订阅MouseDown / Move / Up事件并编写如下内容:

    bool mDragging;

    private bool onTreeEdge(Point pos) {
        return pos.X >= treeView1.DisplayRectangle.Right - 3;
    }
    private void treeView1_MouseMove(object sender, MouseEventArgs e) {
        treeView1.Cursor = mDragging || onTreeEdge(e.Location) ? Cursors.VSplit : Cursors.Default;
        if (mDragging) treeView1.Width = e.X;
    }
    private void treeView1_MouseDown(object sender, MouseEventArgs e) {
        mDragging = onTreeEdge(e.Location);
        if (mDragging) treeView1.Capture = true;
    }
    private void treeView1_MouseUp(object sender, MouseEventArgs e) {
        mDragging = false;
    }

答案 3 :(得分:1)

答案 4 :(得分:-1)

另外,请查看免费Krypton toolkit

附带的拆分容器组件