Wie Kontrollen durch einen Splitter über ihre Container Panel-Größe getrennt, um die Größe?

StackOverflow https://stackoverflow.com/questions/1817453

  •  08-07-2019
  •  | 
  •  

Frage

Ich habe durch Splitter einige Benutzersteuerelemente auf einer Platte getrennt bekam. Die Aufnahmeplatte ist auf Autoscroll.

Da das Splitter-Steuerelement nimmt Größe der Mutter in Betracht, wenn sie die Kontrollen ändern die Größe es teilt ", die Änderung der Größe der Benutzersteuerelemente im Innern durch die Größe der Platte begrenzt ist.

Ich möchte in die Lage, den Splitter bis zu bewegen, wo die Maus war (auch über die Grenzen der Behälter / Form), wenn der Benutzer loslassen und die Behälterplatte entsprechend die Größe (und zeigt die Bildlaufleisten, falls erforderlich) .

Ich habe alle möglichen Kombinationen versucht, mit es mit verschiedenen Panels Einwickeln, spielen mit dem MinSize etc .. Das ist das Beste, was ich mit so weit kam, aber es ist nicht das, was ich will:

alt text

Hat jemand irgendwelche Ideen?

War es hilfreich?

Lösung

Sie können eine Maus-Hook rel="nofollow wenn die Maustaste gedrückt und aushängen, wenn die Maustaste losgelassen wird. In dem Hook-Rückruf, können Sie die Mausposition beobachten und die Steuerung entsprechend ändern.

Bearbeiten:

Sie könnten stattdessen eine spezielle Steuerung verwendet werden, die der Benutzer zieht die Bildlaufposition in der unteren rechten Ecke des übergeordneten Containers zu halten. Der Benutzer kann die Steuerung ziehen die Fläche größer und machen, wenn Sie nicht Anker oder Dock-Einstellungen verwenden, können Sie manuell die Größe der Regler bestimmen die Eltern Bereich zu füllen.

I umgesetzt etwas wie dies vor einiger Zeit für ein Projekt, das ich tat. Ich habe es dreieckig und sieht aus wie ähnlich den „Griff“ auf einem ToolStrip. Hier einige Code-Fragmente aus der ScrollHolder Steuerung:

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);
}

Was die tatsächliche Verhalten Umsetzung geht, werden Sie wahrscheinlich wollen:

  • Blättern Sie zu dem Scroll-Halter, wenn es außerhalb des sichtbaren Bereichs bewegt wird:
  • Wenn Sie mit dem Scroll-Halter Scrollen, verlangsamen durch Thread.Sleep für eine kurze Zeit (zB 50 ms) aufrufen.

Andere Tipps

Sie müssen die MinExtra Eigenschaft des Splitter auf eine große negative Zahl setzen. Während die Immobilie selbst dies nicht zulässt, dass Sie das Feld durch Reflexion verändern könnte:

typeof(Splitter).GetField("minExtra", Reflection.BindingFlags.Instance | Reflection.BindingFlags.NonPublic).SetValue(mySplitter, -10000);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top