كيفية تغيير حجم عناصر التحكم مفصولة الخائن خارج الحاويات لوحة الحجم ؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

لدي بعض UserControls على لوحة يفصل بينهما شق.تحتوي على لوحة تعيين AutoScroll.

منذ الخائن التحكم يأخذ الوالد الحجم في الاعتبار عند تغيير حجم عناصر التحكم "الإنشقاقات" ، تغيير الحجم UserControls داخله محدود لوحة الحجم.

أريد أن تكون قادرة على التحرك الخائن أسفل إلى أي مكان الماوس كان (حتى خارج حدود الحاوية/شكل) عندما يقوم المستخدم الإفراج عنها ، وقد الحاوية الفريق تغيير حجم وفقا لذلك (و تظهر أشرطة التمرير إذا لزم الأمر) .

لقد حاولت جميع أنواع تركيبات مع التغليف مع لوحات مختلفة, اللعب مع MinSize الخ..هذا هو أفضل خطرت لي حتى الآن, ولكن هذا ليس ما أريد:

alt text

هل من أحد لديه أي أفكار ؟

هل كانت مفيدة؟

المحلول

هل يمكن تحديد ربط الماوس عندما زر الماوس الضغط وفكه عند تحرير زر الماوس.في هوك رد ، يمكنك مشاهدة الماوس موقف وتغيير التحكم حسب الاقتضاء.

تحرير:

يمكنك بدلا من ذلك استخدام التحكم الخاصة التي يمكن للمستخدم سحب عقد موضع التمرير في أسفل الزاوية اليمنى من الحاوية الأصل.يمكن للمستخدم سحب التحكم لجعل مساحة أكبر و, إذا كنت لا تستخدم مرساة أو قفص الاتهام إعدادات, يمكنك يدويا ضبط حجم عناصر التحكم الخاصة بك لملء المنطقة الوالدين.

أنا تنفذ شيئا من هذا القبيل في حين يعود لمشروع فعلت.أنا جعلت من الثلاثي تبدو مماثلة إلى "قبضة" على 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 مللي ثانية).

نصائح أخرى

وتحتاج إلى تعيين الخاصية MinExtra من Splitter إلى رقم سالب كبير. في حين أن الملكية نفسها لا يسمح بذلك يمكن تغيير الميدان من خلال التأمل:

typeof(Splitter).GetField("minExtra", Reflection.BindingFlags.Instance | Reflection.BindingFlags.NonPublic).SetValue(mySplitter, -10000);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top