Como redimensionar controles separados por um divisor além de seu tamanho do painel recipiente?

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

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu tenho alguns UserControls em um painel separado por divisores. O painel é definido como contendo deslocamento automático.

Uma vez que o controle Splitter leva tamanho de seu parent em consideração quando se redimensiona os controles de TI dos splits, o redimensionamento das UserControls dentro dela é limitado pelo tamanho do painel.

Eu quero ser capaz de mover o divisor para baixo para onde o mouse foi (mesmo além dos limites do recipiente / form) quando o usuário liberá-lo, e ter o redimensionamento do painel recipiente de acordo (e mostrar as barras de rolagem, se necessário) .

Eu tentei todos os tipos de combinações com envolvê-lo com diferentes painéis, brincando com o MinSize etc .. Este é o melhor que eu vim com até agora, mas não é o que eu quero:

text alt

Alguém tem alguma idéia?

Foi útil?

Solução

Você pode definir um href="http://blogs.msdn.com/toub/archive/2006/05/03/589468.aspx" rel="nofollow noreferrer"> gancho do mouse

Editar:

Você poderia, em vez usar um controle especial que o usuário pode arrastar para manter a posição de rolagem no canto inferior direito do contêiner pai. O usuário pode arrastar o controle para tornar a área maior e, se você não estiver usando âncora ou atracar configurações, você pode ajustar manualmente o tamanho de seus controles para preencher a área de pai.

Eu implementei algo parecido com isso um tempo atrás para um projeto que eu fiz. Eu fiz isso triangular e olhar como semelhante ao "aperto" em um ToolStrip. Eis alguns fragmentos de código do controle 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);
}

No que diz respeito à implementação comportamento real vai, você provavelmente vai querer:

  • Vá até o suporte do livro que se moveu fora da área visível:
  • Ao rolar para o titular da rolagem, retardá-lo chamando Thread.Sleep por um curto período de tempo (como 50 ms).

Outras dicas

Você precisa definir a propriedade MinExtra do Splitter a um grande número negativo. Enquanto a propriedade em si não permite isso, você pode alterar o campo através da reflexão:

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