C# 如何将拆分器分隔的控件的大小调整为超出其容器面板大小?

C# 如何将拆分器分隔的控件的大小调整为超出其容器面板大小?,c#,winforms,c#-2.0,splitter,C#,Winforms,C# 2.0,Splitter,我在一个面板上有几个用户控件,它们被拆分器隔开。 包含面板设置为自动滚动 由于拆分器控件在调整其“拆分”的控件的大小时会考虑其父控件的大小,因此其内部UserControls的大小受面板大小的限制 我希望在用户释放拆分器时,能够将其向下移动到鼠标所在的位置(甚至超出容器/表单的边界),并相应地调整容器面板的大小(必要时显示滚动条) 我尝试过各种组合,用不同的面板包装,玩MinSize等等。。 这是迄今为止我想到的最好的,但不是我想要的: 有人有什么想法吗?您可以在按下鼠标按钮时设置一个钩,然后

我在一个面板上有几个用户控件,它们被拆分器隔开。 包含面板设置为自动滚动

由于拆分器控件在调整其“拆分”的控件的大小时会考虑其父控件的大小,因此其内部UserControls的大小受面板大小的限制

我希望在用户释放拆分器时,能够将其向下移动到鼠标所在的位置(甚至超出容器/表单的边界),并相应地调整容器面板的大小(必要时显示滚动条)

我尝试过各种组合,用不同的面板包装,玩MinSize等等。。 这是迄今为止我想到的最好的,但不是我想要的:

有人有什么想法吗?

您可以在按下鼠标按钮时设置一个钩,然后在松开鼠标按钮时取消钩。在钩子回调中,可以观察鼠标位置并根据需要调整控件的大小

编辑:

您可以使用一个特殊的控件,用户可以拖动该控件以保持父容器右下角的滚动位置。用户可以拖动控件使区域变大,如果不使用锚定或停靠设置,则可以手动调整控件的大小以填充父区域

不久前,我在一个项目中实现了类似的东西。我把它做成三角形,看起来像
工具条上的“夹点”。下面是来自
ScrollHolder
控件的一些代码片段:

public ScrollHolder()
{
    this.Size = new Size(21, 21);
    this.BackColor = SystemColors.Control;
}

protected override void OnPaint(PaintEventArgs e)
{
    Point bottomLeft = new Point(0, this.Height);
    Point topRight = new Point(this.Width, 0);
    Pen controlDark = SystemPens.ControlDark;
    Pen controlLightLight = SystemPens.ControlLightLight;
    Pen controlDark2Px = new Pen(SystemColors.ControlDark, 2);
    Point bottomRight = new Point(this.Width, this.Height);
    e.Graphics.DrawLine(
        controlLightLight, 
        bottomLeft.X, 
        bottomLeft.Y - 2, 
        bottomRight.X, 
        bottomRight.Y - 2);
    e.Graphics.DrawLine(controlDark, bottomLeft, topRight);
    e.Graphics.DrawLine(
        controlLightLight, 
        bottomLeft.X + 1, 
        bottomLeft.Y, 
        topRight.X, 
        topRight.Y + 1);
    e.Graphics.DrawLine(controlDark2Px, bottomLeft, bottomRight);
    e.Graphics.DrawLine(controlDark2Px, bottomRight, topRight);
    int xNumberOfGripDots = this.Width / 4;
    for (int x = 1; x < xNumberOfGripDots; x++)
    {
        for (int y = 1; y < 5 - x; y++)
        {
            DrawGripDot(e.Graphics, new Point(
                this.Width - (y * 4), this.Height - (x * 4) - 1));
        }
    }
}

private static void DrawGripDot(Graphics g, Point location)
{
    g.FillRectangle(
        SystemBrushes.ControlLightLight, location.X + 1, location.Y + 1, 2, 2);
    g.FillRectangle(SystemBrushes.ControlDark, location.X, location.Y, 2, 2);
}

protected override void OnResize(EventArgs e)
{
    this.SetRegion();
    base.OnResize(e);
}

private void SetRegion()
{
    GraphicsPath path = new GraphicsPath();
    path.AddPolygon(new Point[] 
    { 
        new Point(this.Width, 0), 
        new Point(this.Width, this.Height),
        new Point(0, this.Height) 
    });
    this.Region = new Region(path);
}
publicScrollHolder()
{
该尺寸=新尺寸(21,21);
this.BackColor=SystemColors.Control;
}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
点bottomLeft=新点(0,此高度);
Point topRight=新点(此点为0.Width);
Pen controlDark=系统PENS.controlDark;
笔控灯=系统笔控灯;
Pen controlDark2Px=新笔(SystemColor.ControlDark,2);
点bottomRight=新点(this.Width,this.Height);
e、 拉丝(
控制灯,
左下角.X,
左下角。Y-2,
右下角.X,
右下角(Y-2);
e、 图形.抽绳(controlDark,左下,右上);
e、 拉丝(
控制灯,
左下角.X+1,
左下角,
右上角.X,
右上角Y+1);
e、 绘图线(controlDark2Px,左下角,右下角);
e、 绘图线(controlDark2Px,右下角,右上角);
int xNumberOfGripDots=此.Width/4;
对于(int x=1;x
就实际的行为实现而言,您可能希望:

  • 将滚动条移到可见区域外时滚动至滚动条保持架:
  • 当滚动到滚动保持架时,通过短时间(例如50毫秒)调用
    Thread.Sleep
    来降低滚动保持架的速度

您需要将
拆分器的
MinExtra
属性设置为大负数。虽然属性本身不允许这样做,但您可以通过反射来更改字段:

typeof(Splitter).GetField("minExtra", Reflection.BindingFlags.Instance | Reflection.BindingFlags.NonPublic).SetValue(mySplitter, -10000);

我正在考虑做那样的事情。但是,它与拆分器“阴影”的绘制产生了一些不一致。它将受到拆分器控件本身的限制(除非我使用自己的控件)。当你有2个以上的用户控件(我有)时,这是非常明显的。顺便说一句,即使在表单之外,您仍然会收到“SplitterMoving”事件。所以,不需要一个钩子。