[英]C# WinForms: Make panel scrollbar invisible
我有一個帶有AutoScroll = true
的panel1
。我必須使用btnUp
和btnDown
使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);
}
}
}
圖片示例:
您必須在面板上將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.
你可以試試這個來解決這個問題,我已經從這個鏈接復制了它。
如果 AutoScroll 設置為 true,則無法修改 VerticalScroll 或 HorizontalScroll 中的任何內容。 AutoScroll的意思是AutoScroll; 控件決定滾動條何時可見、最小值/最大值是多少等等,您無法更改任何內容。 因此,如果您想自定義滾動(例如隱藏滾動條),您必須將 AutoScroll 設置為 false。
查看帶有 Lutz Roeder 的 .NET 反射器的 ScrollableControl 的源代碼,您可以看到,如果 AutoScroll 設置為 true,它會忽略您嘗試更改 VerticalScroll 或 HorizontalScroll 屬性(例如 MinValue、MaxValue、Visible 等)中的屬性值的嘗試。
將 AutoScroll 設置為 false,您可以更改 VerticalScroll.Minimum、VerticalScroll.Maximum 和 VerticalScroll.Visible 值。 但是,您不能更改 VerticalScroll.Value !!! 哇! 如果您將其設置為非零值,它會將自身重置為零。 相反,您必須設置 AutoScrollPosition = new Point( 0, desired_vertical_scroll_value ); 最后,令人驚訝的是,當您分配正值時,它會將它們翻轉為負值,因此如果您檢查 AutoScrollPosition.X,它將為負值! 將其分配為正值,它返回為負值。 所以是的,如果您想要自定義滾動,請將 AutoScroll 設置為 false。 然后設置 VerticalScroll 和 HorizontalScroll 屬性(Value 除外)。 然后要更改滾動值,您需要設置 AutoScrollPosition,即使您沒有使用自動滾動! 最后,當您設置 AutoScrollPosition 時,它將采用您分配給它的相反(即負)值,因此如果您想稍后檢索當前 AutoScrollPosition,例如如果您想通過拖動鼠標來偏移滾動值要平移,那么您需要記住在將 AutoScrollPosition 返回的值重新分配給 AutoScrollPosition 並帶有一些偏移量之前否定它。 哇。 哇。
另一件事,如果您嘗試使用鼠標平移,請使用 Cursor.Position 的值而不是鼠標事件參數返回的任何鼠標位置。 滾動控件也會導致事件參數值發生偏移,這將導致它開始觸發鼠標移動事件,並帶有不需要的值。 只需使用 Cursor.Position,因為它將使用鼠標屏幕坐標作為固定參考框架,這正是您嘗試平移/偏移滾動值時所需要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.