Проблемы с полосой прокрутки в C # UserControl - PullRequest
1 голос
/ 24 мая 2019

У меня проблемы с установкой свойства VerticalScroll/HorizontalScroll.Value.Каждый раз, когда я устанавливаю значение, полоса прокрутки перемещается, а затем щелкает назад (см. Скриншот ниже)

screenshot

Вот код для моего пользовательского элемента управления:

using System.Drawing;
using System.Windows.Forms;

namespace MyGanttChart
{
    public class Chart : UserControl
    {
        public Chart()
        {
            HorizontalScroll.Visible = true;
            VerticalScroll.Visible = true;
        }

        protected override void OnMouseWheel(MouseEventArgs e)
        {
            base.OnMouseWheel(e);

            ScrollEventType scrollType = ScrollEventType.SmallIncrement;
            if (e.Delta > 0)
                scrollType = ScrollEventType.SmallDecrement;

            ScrollOrientation orientation = ScrollOrientation.VerticalScroll;
            if (ModifierKeys == Keys.Shift)
                orientation = ScrollOrientation.HorizontalScroll;

            ScrollEventArgs args = new ScrollEventArgs(scrollType, 1, orientation);
            OnScroll(args);
        }

        protected override void OnScroll(ScrollEventArgs se)
        {
            base.OnScroll(se);

            if (se.ScrollOrientation == ScrollOrientation.HorizontalScroll)
            {
                //if (se.Type == ScrollEventType.SmallIncrement || se.Type == ScrollEventType.LargeIncrement)
                //    X -= HorizontalScroll.LargeChange; // se.NewValue;
                //else if (se.Type == ScrollEventType.SmallDecrement || se.Type == ScrollEventType.LargeDecrement)
                //    X += HorizontalScroll.LargeChange;

                if ((se.Type == ScrollEventType.SmallIncrement || se.Type == ScrollEventType.LargeIncrement) &&
                    HorizontalScroll.Value + HorizontalScroll.LargeChange <= HorizontalScroll.Maximum)
                {
                    HorizontalScroll.Value += HorizontalScroll.LargeChange;
                }
                else if ((se.Type == ScrollEventType.SmallDecrement || se.Type == ScrollEventType.LargeDecrement) &&
                    HorizontalScroll.Value - HorizontalScroll.LargeChange >= HorizontalScroll.Minimum)
                {
                    HorizontalScroll.Value -= HorizontalScroll.LargeChange;
                }
            }
            else if (se.ScrollOrientation == ScrollOrientation.VerticalScroll)
            {
                //if (se.Type == ScrollEventType.SmallIncrement || se.Type == ScrollEventType.LargeIncrement)
                //    Y -= VerticalScroll.LargeChange;
                //else if (se.Type == ScrollEventType.SmallDecrement || se.Type == ScrollEventType.LargeDecrement)
                //    Y += VerticalScroll.LargeChange;

                if ((se.Type == ScrollEventType.SmallIncrement || se.Type == ScrollEventType.LargeIncrement) &&
                    VerticalScroll.Value + VerticalScroll.LargeChange <= VerticalScroll.Maximum)
                {
                    VerticalScroll.Value += VerticalScroll.LargeChange;
                }
                else if ((se.Type == ScrollEventType.SmallDecrement || se.Type == ScrollEventType.LargeDecrement) &&
                    VerticalScroll.Value - VerticalScroll.LargeChange >= VerticalScroll.Minimum)
                {
                    VerticalScroll.Value -= VerticalScroll.LargeChange;
                }
            }

            this.Invalidate(); //Force the control to redraw
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            if (!this.DesignMode)
                Draw(e.Graphics, e.ClipRectangle);
        }

        public float X = 0;
        public float Y = 0;

        private void Draw(Graphics graphics, Rectangle rect)
        {
            graphics.TranslateTransform(X, Y);
            graphics.Clear(Color.White);

            Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
            graphics.DrawString("hi", this.Font, new SolidBrush(Color.Black), center.X, center.Y, new StringFormat() { Alignment = StringAlignment.Center});

            graphics.Flush();
        }
    }
}

(контрольный вид в настоящее время не перемещается - у меня это работало со значениями X и Y, но я сейчас работаю со значениями полосы прокрутки)

Я видел этот вопрос, но установка значения дважды или вызов PerformLayout(), похоже, не работают для меня.Есть предложения?

1 Ответ

0 голосов
/ 24 мая 2019

Из того, что я вижу в вашем коде, вам не нужен какой-либо специальный код для управления прокруткой чертежа.

Во-первых, вам нужно добавить дочернюю панель внутри вашего usercontrol, которая будет контейнером.рисунка.Таким образом, вы перемещаете чертежный код на эту панель.Вы должны убедиться, что эта панель изменит свой размер, если рисунок должен быть больше.Это то, что будет отображать полосы прокрутки в usercontrol.

Во-вторых, вы должны установить для свойства AutoScroll вашего usercontrol значение True.Это обеспечит прокрутку любого дочернего элемента управления, имеющего размер или положение, превышающее размер пользовательского элемента управления.Посмотрите на свойство AutoScrollMargin тоже.Это делается автоматически с помощью фреймворка, поэтому никакой другой код не требуется.Разве это не красиво?

Наконец, вы можете удалить две добавленные полосы прокрутки.

Редактировать: Более того, при рисовании вам не нужно компенсировать положение прокрутки.Вы просто рисуете с происхождением 0,0, не заботясь о свитке.Кроме того, выполнение этого способа предотвратит любое мерцание, вызванное постоянным перерисовыванием.

...