Расположение полосы прокрутки перемещает видимые / невидимые изменения управления - PullRequest
1 голос
/ 14 декабря 2010

У меня есть форма с прокручиваемой панелью и двумя элементами управления, расположенными прямо друг над другом - одного видимого нет.На основании определенного условия, когда эта форма активирована, я могу поменять видимые свойства двух элементов управления.Эти элементы управления находятся внизу прокручиваемой панели.Если при выходе из этой формы я оставляю ее прокрученной до конца, измените условие, при котором видимость элементов управления поменяется местами, и вернитесь к этой форме, видимый элемент управления упадет примерно на 200 пикселей вниз по странице, оставив большой пробел.Кто-нибудь знает, что может быть причиной этого?Я попытался сбросить положение полосы прокрутки вверх при закрытии формы, но это просто вызывает меньший зазор, а иногда элемент управления перемещается выше в другие элементы управления.Есть идеи?

Ответы [ 3 ]

1 голос
/ 30 июля 2015

Вот пример, который воспроизводит проблему. Если навести курсор мыши на красную метку, видимость кнопки 2 изменится на true, что приведет к возврату прокрутки обратно к кнопке 1.

public class Form123456 : Form {

    public Form123456() {
        Controls.Add(new UC1());
    }

    public class UC1 : UserControl {
        Button b1 = new Button { Text = "Button1" };
        Label lb = new Label { Text = "_", AutoSize = true, BackColor = Color.Red };
        Button b2 = new Button { Text = "Button2", Visible = false };
        Button b2b = new Button { Text = "x" };
        Button b3 = new Button { Text = "Button3" };
        public UC1() {
            AutoScroll = true;
            Dock = DockStyle.Fill;
            b1.Location = new Point(0, 200);
            b2.Location = new Point(0, 600);
            lb.Location = new Point(70, 600);
            b2b.Location = new Point(90, 600);
            b3.Location = new Point(0, 800);
            Controls.Add(b1);
            Controls.Add(b2);
            Controls.Add(lb);
            Controls.Add(b2b);
            Controls.Add(b3);

            lb.MouseEnter += delegate {
                b2.Visible = true;
            };
            lb.MouseLeave += delegate {
                b2.Visible = false;
            };
        }
    }
}

Чтобы исправить это, одним из решений является добавление этого кода:

    protected override Point ScrollToControl(Control activeControl) {
        return this.AutoScrollPosition;
    }

Решение от: Почему щелчок в текстовом поле приводит к прокрутке панели автопрокрутки до самого верха?

0 голосов
/ 18 августа 2016

Подтвердили ли вы порядок изменения видимости двух элементов управления?Полосы прокрутки на контейнере с автоматической прокруткой, установленной в значение true, будут появляться и исчезать в зависимости от положения элементов управления, которые находятся за пределами видимой области элемента управления.Невидимые элементы управления не учитываются.Так что в вашем случае, если вы сделаете оба элемента управления невидимыми в любое время, полосы прокрутки исчезнут.Они вернутся, когда один элемент управления станет видимым.Поэтому, чтобы убедиться, что у вас нет перехода в положение полосы прокрутки и положение элементов управления, вы должны убедиться, что оба элемента управления никогда не будут видны.Другое решение состоит в том, чтобы иметь псевдо-видимый элемент управления на контейнере.Это элемент управления, для которого видимость установлена ​​в значение true, но на самом деле он невидим для пользователя (например, точка цвета фона, метка без текста ...).Поместите этот элемент управления в крайнее положение x, y, и полосы прокрутки никогда не исчезнут.

0 голосов
/ 14 декабря 2010

Нет воспроизведения.Мне кажется, что вы делаете больше, чем просто изменяете свойство Visible.Всякий раз, когда вы назначаете свойство Location, вы должны добавить AutoScrollPosition, чтобы компенсировать состояние прокрутки.Почтовый индекс, если это не помогает.

...