C# - 解決Winform中鼠標滾輪沒法操做Panel滾動條的問題

最近發現一個現象,就是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

相關文章
相關標籤/搜索