最近發現一個現象,就是Winform工程中Panel容器右側的滾動條,常常沒法被鼠標滾輪觸發。今天我研究了下這個問題。函數
首先我發現鼠標滾輪有時候是能夠滑動Panel右側的滾動條,但有的時候不能。通過測試,發現只有在Panel或Panel內控件獲取焦點的時候,鼠標的滾輪才能操做Panel的滾動條。因此,當焦點在指定帶滾動條的Panel外時,若是鼠標點擊Panel內部的TextBox等能夠獲取焦點的控件時,Panel右側的滾動條是受控的。若是點擊Panel的空白部分、Panel下沒法獲取焦點的控件(如Label)、Panel下的子容器(Panel中的Panel、GroupBox等),Panel的滾動條就不會受鼠標滾輪控制。工具
爲此我寫了一個工具類,用於處理本問題:測試
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace PanelScorllTest { class PanelScrollHelper { /// <summary> /// 初始化Panel /// </summary> /// <param name="panel"></param> public static void InitializePanelScroll(Panel panel) { panel.Click += (obj, arg) => { panel.Select(); }; InitializePanelScroll(panel, panel); return; } /// <summary> /// 遞歸初始化Panel內部各容器和控件 /// </summary> /// <param name="container"></param> /// <param name="panelRoot"></param> private static void InitializePanelScroll(Control container, Control panelRoot) { foreach (Control control in container.Controls) { if (control is Panel || control is GroupBox || control is SplitContainer || control is TabControl || control is UserControl) { control.Click += (obj, arg) => { panelRoot.Select(); }; InitializePanelScroll(control, panelRoot); } else if (control is Label) { control.Click += (obj, arg) => { panelRoot.Select(); }; } } } } }
若是要設置一個Panel(假設名爲pnlLeft和pnlRight)的滾動條保持始終可用,則在該Panel所在窗體的Load函數中加入以下代碼便可。spa
以下面這個示例界面,有pnlLeft和pnlRight兩個Panel有滾動條,將這兩個Panel的AutoScroll屬性設置爲True。code
在其Load函數中加入以下代碼,便可在點擊每一個Panel內部的任何部位後,就用鼠標滾輪操做所在Panel的滾動條:orm
private void Form1_Load(object sender, EventArgs e) { PanelScrollHelper.InitializePanelScroll(pnlLeft); PanelScrollHelper.InitializePanelScroll(pnlRight); }
有一點須要注意,若是Panel已有了支持滾動條的控件,如支持了MultiLine的TextBox,那麼鼠標點擊該控件後,該控件獲取焦點,滑動鼠標滾輪後,滾動的是該控件的滾動條,而不會是Panel的滾動條。不過在這種狀況下,我認爲Panel的滾動條對鼠標滾輪失效是合理的,因此我也沒有過多去關注這個問題。遞歸
ENDit