Пользовательские полосы прокрутки запускают полосы прокрутки AutoScroll - PullRequest
0 голосов
/ 24 июня 2018

Я использовал UserControl для отображения списка элементов управления. Сначала я включил AutoScroll, а затем решил не использовать его. Я предпочел не использовать его, так как он выделялся и просто не «хорошо» смотрелся с темой элементов управления, которую я использовал.

Я сделал снимок в рамках, называемом MetroFramework , и решил использовать элемент управления MetroScrollBar полосы прокрутки для вертикальной полосы прокрутки.

Я полностью отключил автоматическую прокрутку и решил использовать полосу прокрутки. Я просто сделал это:

scbMain.Scroll += (sender, e) => { VerticalScroll.Value = scbMain.Value; };

(где scbMain - полоса прокрутки, которую я обсуждаю)

Это работает, но не так, как ожидалось. Как только я прокручиваю, я получаю сумасшедший мерцающий эффект от полосы прокрутки по умолчанию, как показано здесь . Более длинный список имеет тот же эффект, но более выраженный .

Я пытался скрыть существующие полосы прокрутки:

VerticalScroll.Visible = false;
HorizontalScroll.Visible = false;
VerticalScroll.Enabled = false;
HorizontalScroll.Enabled = false;

Это никак не повлияло на решение моей проблемы.

Следует отметить: моя полоса прокрутки пристыкована вправо, и в пределах UserControl.

нет других элементов управления контейнером.

1 Ответ

0 голосов

Хорошо. Задача решена. Проблема была в этой строке кода:

scbMain.Scroll += (sender, e) => { ----> /*(Here*/ VerticalScroll.Value = scbMain.Value; <---- };

Вы фактически устанавливаете значение прокрутки своего пользовательского элемента управления, в основном вы говорите системе, чтобы оно вызывало свойство autoscroll для установки значения!

Правильный способ - НЕ прокручивать пользовательский элемент управления, а прокручивать контейнер внутри, например, панели. Поэтому добавьте панель в свой пользовательский элемент управления. Вы собираетесь прокрутить панель и все элементы управления внутри нее (в этом примере я добавлю кнопку).

this.btnExample.Location = new System.Drawing.Point(62, 0);
this.btnExample.Name = "btnExample";
this.btnExample.Size = new System.Drawing.Size(75, 390);
this.btnExample.TabIndex = 1;
this.btnExample.Text = "Out of Bounds";
this.btnExample.UseVisualStyleBackColor = true;

this.panel1.Controls.Add(this.btnExample);
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(270, 391); //the width must fit inside your user control and the height was arbitrary
this.panel1.TabIndex = 2;

this.Controls.Add(this.panel1);
this.Controls.Add(this.scbMain);
this.Name = "CtrlScroll";
this.Size = new System.Drawing.Size(474, 300);

Прокрутка:

public CtrlScroll() {
        InitializeComponent();

        scbMain.Scroll += ( sender, e ) => {
            //Normally the if statement whouldn't be needed but the metro srollbar
            //has a weird behaviour when the scroll value becomes max
            if( scbMain.Value > panel1.Height - this.Height ) {
                panel1.Top = -( panel1.Height - this.Height );
            }
            else {
                panel1.Top = -scbMain.Value;
            };
        };

        int maxVertical = panel1.Height;

        // SmallChange is typically 1%.
        int smallChangeVertical = Math.Max( (int)( maxVertical / 100 ), 1 );

        // LargeChange is one page.
        int largeChangeVertical = this.Height;

        scbMain.Minimum = 0;
        scbMain.Maximum = maxVertical;
        scbMain.SmallChange = smallChangeVertical;
        scbMain.LargeChange = largeChangeVertical;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...