簡體   English   中英

C# WinForms:使面板滾動條不可見

[英]C# WinForms: Make panel scrollbar invisible

我有一個帶有AutoScroll = truepanel1 。我必須使用btnUpbtnDown使panel1滾動。 到目前為止,我已經完成了我的要求

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或使其不可見。 我試過

panel1.VerticalScroll.Visible = false;

但它不起作用。 有什么想法嗎?

好的,我已經為您完成了這個工作示例。 您所要做的就是根據面板內所有項目的總大小更改最大值。


表格代碼:

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);
        }
    }
}

圖片示例:

圖1圖2

您必須在面板上將AutoScroll選項設置為False 我希望您理解我所做的並讓您的面板按您想要的方式運行。 如果您有任何問題,請隨時提問。

Panel 控件通過將 AutoScroll 設置為 true 來承擔您賦予它的職責。 始終包括在必要時顯示滾動條小工具。 因此,您嘗試的操作無法正常工作,隱藏垂直滾動條會強制面板重新計算布局,因為這樣做會更改客戶區。 它當然會發現需要滾動條並立即使其再次可見。

執行此操作的代碼,Panel 從 ScrollableControl 繼承它,是內部的,不能被覆蓋。 這是故意的。

所以使用 AutoScroll 不會讓你到任何地方。 作為替代方案,請記住您真正想要完成的任務。 您只想上下移動控件。 很容易做到,只需更改他們的 Location 屬性。 如果您將控件放在另一個面板上,這又是最容易做到的,面板足夠大以包含它們。 將其 AutoSize 屬性設置為 True。 並通過簡單地更改該面板的 Location 屬性來實現按鈕的 Click 事件處理程序:

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 是包含控件的內部面板。 當您使用設計器在其上放置控件時要小心,它有給它們錯誤的父級的訣竅。 請務必使用查看 + 其他窗口 + 文檔布局幫助窗口,以便您可以看到這是否出錯。 填充后,將其 AutoSizeMode 屬性設置為 GrowAndShrink,使其對齊到最小尺寸。

您可以使用

FlowLayoutPanel.AdjustFormScrollbars(false);

嘗試這個:

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

編輯:

實際上當 AutoScroll = true; 它將自動處理 hscroll 和 vscroll,您將無法更改它。 我在MSDN上的 Panel.AutoScroll 屬性上找到了這個

 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 或 Horizo​​ntalScroll 中的任何內容。 AutoScroll的意思是AutoScroll; 控件決定滾動條何時可見、最小值/最大值是多少等等,您無法更改任何內容。 因此,如果您想自定義滾動(例如隱藏滾動條),您必須將 AutoScroll 設置為 false。

查看帶有 Lutz Roeder 的 .NET 反射器的 ScrollableControl 的源代碼,您可以看到,如果 AutoScroll 設置為 true,它會忽略您嘗試更改 VerticalScroll 或 Horizo​​ntalScroll 屬性(例如 MinValue、MaxValue、Visible 等)中的屬性值的嘗試。

行為觀察 2:

將 AutoScroll 設置為 false,您可以更改 VerticalScroll.Minimum、VerticalScroll.Maximum 和 VerticalScroll.Visible 值。 但是,您不能更改 VerticalScroll.Value !!! 哇! 如果您將其設置為非零值,它會將自身重置為零。 相反,您必須設置 AutoScrollPosition = new Point( 0, desired_vertical_scroll_value ); 最后,令人驚訝的是,當您分配正值時,它會將它們翻轉為負值,因此如果您檢查 AutoScrollPosition.X,它將為負值! 將其分配為正值,它返回為負值。 所以是的,如果您想要自定義滾動,請將 AutoScroll 設置為 false。 然后設置 VerticalScroll 和 Horizo​​ntalScroll 屬性(Value 除外)。 然后要更改滾動值,您需要設置 AutoScrollPosition,即使您沒有使用自動滾動! 最后,當您設置 AutoScrollPosition 時,它將采用您分配給它的相反(即負)值,因此如果您想稍后檢索當前 AutoScrollPosition,例如如果您想通過拖動鼠標來偏移滾動值要平移,那么您需要記住在將 AutoScrollPosition 返回的值重新分配給 AutoScrollPosition 並帶有一些偏移量之前否定它。 哇。 哇。

另一件事,如果您嘗試使用鼠標平移,請使用 Cursor.Position 的值而不是鼠標事件參數返回的任何鼠標位置。 滾動控件也會導致事件參數值發生偏移,這將導致它開始觸發鼠標移動事件,並帶有不需要的值。 只需使用 Cursor.Position,因為它將使用鼠標屏幕坐標作為固定參考框架,這正是您嘗試平移/偏移滾動值時所需要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM