C# WinForms: сделать панель прокрутки невидимой

у меня есть panel1 С AutoScroll = true.Я должен сделать panel1 свиток btnUp и btnDown. До сих пор я сделал то, что меня просили

private void btnUpClicked(Object sender, EventArgs e)
{
    if (panel1.VerticalScroll.Value - 55 > 0)
        panel1.VerticalScroll.Value -= 55;
    else  panel1.VerticalScroll.Value = 0;
}

private void btnDownClicked(Object sender, EventArgs e)
{
    panel1.VerticalScroll.Value += 55;
}

но теперь мне нужно скрыть Scrollbar или сделать его невидимым. Я пытался!--9-->

panel1.VerticalScroll.Visible = false;

но это не работает. Есть идеи, ребята?

3 ответов


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


код:

public partial class Form1 : Form
{
    private int location = 0;

    public Form1()
    {
        InitializeComponent();

        // Set position on top of your panel
        pnlPanel.AutoScrollPosition = new Point(0, 0);

        // Set maximum position of your panel beyond the point your panel items reach.
        // You'll have to change this size depending on the total size of items for your case.
        pnlPanel.VerticalScroll.Maximum = 280;
    }

    private void btnUp_Click(object sender, EventArgs e)
    {
        if (location - 20 > 0)
        {
            location -= 20;
            pnlPanel.VerticalScroll.Value = location;
        }
        else
        {
            // If scroll position is below 0 set the position to 0 (MIN)
            location = 0;
            pnlPanel.AutoScrollPosition = new Point(0, location);
        }
    }

    private void btnDown_Click(object sender, EventArgs e)
    {
        if (location + 20 < pnlPanel.VerticalScroll.Maximum)
        {
            location += 20;
            pnlPanel.VerticalScroll.Value = location;
        }
        else
        {
            // If scroll position is above 280 set the position to 280 (MAX)
            location = pnlPanel.VerticalScroll.Maximum;
            pnlPanel.AutoScrollPosition = new Point(0, location);
        }
    }
}

фото пример:

Pic1Pic2

вы должны установить до False на панели. Я надеюсь, вы понимаете, что я сделал и сделать панель управлением так, как вы хотеть. Не стесняйтесь спрашивать, если у вас есть вопросы.


Панель управления берет на себя обязанности, которые вы дали ему, установив AutoScroll в true довольно серьезно. Это всегда включает отображение гаджета прокрутки, если это необходимо. Поэтому то, что вы пытались, не может работать, скрывая вертикальную панель прокрутки, чтобы пересчитать макет, так как это изменило клиентскую область. Конечно, он обнаружит, что полоса прокрутки необходима и быстро сделает ее видимой снова.

код, который делает это, панель наследует его от ScrollableControl, составляет внутренние и не может быть переопределен. Это было намеренно.

поэтому использование AutoScroll никуда вас не приведет. В качестве альтернативы, имейте в виду, что вы действительно хотите достичь. Вы просто хотите, чтобы двигаться вверх и вниз. Легко сделать, просто измените свое местоположение. Что в свою очередь проще всего сделать, если вы помещаете элементы на другое панель, достаточно большой, чтобы содержать их. Задайте свойству AutoSize значение True. И реализуйте обработчики событий щелчка кнопок, просто изменив свойство местоположения этой панели:

    private const int ScrollIncrement = 10;

    private void ScrollUpButton_Click(object sender, EventArgs e) {
        int limit = 0;
        panel2.Location = new Point(0, 
            Math.Min(limit, panel2.Location.Y + ScrollIncrement));
    }

    private void ScrollDownButton_Click(object sender, EventArgs e) {
        int limit = panel1.ClientSize.Height - panel2.Height;
        panel2.Location = new Point(0, 
            Math.Max(limit, panel2.Location.Y - ScrollIncrement));
    }

где panel1-внешняя панель, а panel2-внутренняя, содержащая элементы управления. Будьте осторожны, когда вы используете конструктор, чтобы поместить на него элементы управления, у него есть умение давать им неправильный родитель. Обязательно используйте окно View + Other Windows + Document Layout helper, чтобы вы могли видеть, что это происходит неправильно. После его заполнения задайте свойству AutoSizeMode значение GrowAndShrink так оно щелкает к своему минимальному размеру.


попробуйте это:

panel.AutoScroll = true;
panel.VerticalScroll.Enabled = false;
panel.VerticalScroll.Visible = false;

Edit:

На самом деле, когда AutoScroll = true; он будет заботиться о hscroll и vscroll автоматически, и вы не сможете его изменить. Я нашел это на панели.Свойство AutoScroll на MSDN

 AutoScroll maintains the visibility of the scrollbars automatically. Therefore, setting the HScroll or VScroll property to true has no effect when AutoScroll is enabled.

Вы можете попробовать это, чтобы обойти эту проблему, я скопировал его из этого ссылке.

Наблюдения За Поведением 1:

Если AutoScroll имеет значение true, вы не можете ничего изменить в VerticalScroll или HorizontalScroll. AutoScroll означает AutoScroll; элемент управления решает, когда полосы прокрутки видны, что такое min/max и т. д. и ты ничего не можешь изменить. Поэтому, если вы хотите настроить прокрутку (например, скрыть полосы прокрутки), вы должны установить AutoScroll в false.

глядя на исходный код ScrollableControl с помощью .NET-отражателя Lutz Roeder, вы можете увидеть, что если AutoScroll имеет значение true, он игнорирует ваши попытки изменить значения свойств в пределах Свойства VerticalScroll или HorizontalScroll как MinValue, MaxValue, Visible etc.

Наблюдения За Поведением 2:

С AutoScroll установлен в false, вы можете изменить VerticalScroll.Минимум, VerticalScroll.Максимум, VerticalScroll.Видимые значения. Однако, вы не можете изменить VerticalScroll.Ценность!!! Wtf! Если вы установите для него ненулевое значение, он сбрасывается до нуля. Вместо этого необходимо задать AutoScrollPosition = new Point( 0, desired_vertical_scroll_value ); И, наконец,, Удивительно, когда вы назначаете положительные значения, он переворачивает их на отрицательные значения,поэтому, если вы проверяете Автопрокрутку.X, это будет отрицательно! Назначьте его положительным, он вернется отрицательным. Так что да, если вы хотите пользовательскую прокрутку, установите AutoScroll в false. Затем задайте свойства VerticalScroll и HorizontalScroll (кроме значения). Затем, чтобы изменить значение прокрутки, вам нужно установить AutoScrollPosition, даже если вы не используете автоматическую прокрутку! Наконец, когда вы установите AutoScrollPosition, это займет на противоположном (т. е. отрицательном) значении, которое вы назначаете ему, поэтому, если вы хотите получить текущую Автопрокрутку позже, например, если вы хотите смещать значение прокрутки, перетаскивая мышь на панорамирование, то вам нужно помнить, чтобы отрицать значение, возвращаемое Автопрокруткой, прежде чем переназначать его на Автопрокрутку с некоторым смещением. КРУТО. Какого черта.

еще одна вещь, если вы пытаетесь перемещение с помощью мыши, используйте значения из курсора.Положение, а не любые местоположения мыши возвращается параметрами событий мыши. Прокрутка элемента управления приведет к смещению значений параметров события, что приведет к запуску событий перемещения мыши с нежелательными значениями. Просто используйте курсор.Положение, потому что он будет использовать координаты экрана мыши в качестве фиксированной системы отсчета, что вы хотите, когда пытаетесь панорамировать/смещать значение прокрутки.