1. 程式人生 > 實用技巧 >ScrollViewer巢狀的DataGrid、ListBox等控制元件的滑鼠滾動事件無效,子控制元件攔截父控制元件滾動效果解決辦法

ScrollViewer巢狀的DataGrid、ListBox等控制元件的滑鼠滾動事件無效,子控制元件攔截父控制元件滾動效果解決辦法

註冊子控制元件的PreviewMouseWheel,然後在滾動的時候設定控制元件的 IsHitTestVisible = false,因為這個引數設為false之後子控制元件裡面的TextBox,CheckBox會失效,所以在停止滾動後要把引數設回來。程式碼如下

 private void girdOrder_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            RetryUtil.TimeOutAction(200, () =>
            {
                
this.Dispatcher.Invoke(() => { this.IsHitTestVisible = false; }); }, () => { this.Dispatcher.Invoke(() => { this.IsHitTestVisible = true; }); }); }

下面是TimeOutAction的程式碼片

/// <summary>
        /// 
        /// </summary>
        /// <param name="TS">超時等待時長ms</param>
        /// <param name="OnAction">執行任務</param>
        /// <param name="TimeAction">超時處理任務</param>
        public static void TimeOutAction(int TS, Action OnAction, Action TimeAction)
        {
            CancellationTokenSource cts 
= new CancellationTokenSource(TS); cts.Token.Register(() => {//等待設定時間後執行 TimeAction(); }); Task.Factory.StartNew(() => {//立即執行 while (!cts.Token.IsCancellationRequested) { OnAction(); Task.Delay(TS).Wait(); } }, cts.Token); }