2

我在一个由分隔符分隔的面板上有一些用户控件。包含面板设置为 AutoScroll。

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

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

我已经尝试了各种组合,用不同的面板包裹它,玩 MinSize 等。这是迄今为止我想出的最好的,但这不是我想要的:

替代文字

有没有人有任何想法?

4

2 回答 2

3

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

typeof(Splitter).GetField("minExtra", Reflection.BindingFlags.Instance | Reflection.BindingFlags.NonPublic).SetValue(mySplitter, -10000);
于 2018-05-15T16:29:55.220 回答
2

您可以在按下鼠标按钮时设置鼠标挂钩,并在释放鼠标按钮时取消挂钩。在钩子回调中,您可以观察鼠标位置并根据需要调整控件的大小。

编辑:

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

不久前,我为我所做的一个项目实施了这样的事情。我把它做成三角形,看起来类似于ToolStrip. 以下是控件中的一些代码片段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);
}

就实际行为实现而言,您可能希望:

  • 当滚动条移出可见区域时滚动到滚动条:
  • Thread.Sleep滚动到滚动架时,通过调用一小段时间(例如 50 毫秒)来减慢它的速度。
于 2009-11-30T01:49:20.877 回答