久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

WPF嵌套DataGrid鼠標(biāo)滾輪失效徹底解決:基于附加屬性的通用方案

WPF嵌套DataGrid鼠標(biāo)滾輪失效徹底解決:基于附加屬性的通用方案 遇到 DataGrid 嵌套 DataGrid 導(dǎo)致內(nèi)部滾輪失效的情況有不少朋友踩過坑我自己第一次碰到也折騰了好一會兒。界面表現(xiàn)很明顯頁面上有一個主表格行里又嵌了一個子表格鼠標(biāo)一旦移到內(nèi)部子表格的區(qū)域滾輪滾動時就毫無反應(yīng)仿佛那個位置的滾輪事件被什么東西吃掉了一樣。其實鼠標(biāo)事件還在只是被內(nèi)層控件的滾動機制攔截了沒有傳給外層滾動容器。這個問題的根子在于 WPF 的路由事件機制。具體來說DataGrid 內(nèi)部有一個 ScrollViewer 負責(zé)滾動它處理鼠標(biāo)滾輪事件時會把這個事件標(biāo)記為“已處理”。但事件路由一旦被標(biāo)記為已處理就不會再冒泡給外層元素所以外層的 ScrollViewer 根本接收不到滾輪消息自然也就不會滾動。內(nèi)層 DataGrid 的高度如果是自動撐開的它自己反而又沒有真正的滾動條可用兩者疊加就出現(xiàn)了“鼠標(biāo)滾輪失效”的假象。我翻了不少資料也試過幾種方案總體的解決思路是在子 DataGrid 的滾動條到達邊界時把滾輪事件“歸還”給父級滾動容器或者在事件冒泡的早期階段做干預(yù)讓父級滾動條優(yōu)先感知滾輪動作。下面我把完整的方案和代碼整理出來順便聊聊我在實操中踩過的坑。1. 問題技術(shù)原理解析1.1 為什么嵌套后滾輪會無效先說清楚事件模型的底層行為。WPF 中的鼠標(biāo)滾輪事件是路由事件路由方向是“隧道 冒泡”兩條路徑。常規(guī)情況下鼠標(biāo)滾輪事件先走隧道階段從根元素一路向下到達目標(biāo)元素再走冒泡階段從目標(biāo)元素逐級向上返回根元素。但對于 ScrollViewer 來說Windows 原生消息在進入 WPF 后會被轉(zhuǎn)換成 MouseWheelEventArgs 事件該事件的 Handled 屬性會在 ScrollViewer 自身處理滾輪滾動后被置為 true。而路由事件的一個特性就是某個元素把 Handled 設(shè)為 true 之后上層元素的 AddHandler 默認(rèn)不會收到該事件簡單說就是事件“短路”了。內(nèi)層 DataGrid 的 ScrollViewer 接收并處理了滾輪事件事件就不再往上冒泡外層 ScrollViewer 壓根不知道鼠標(biāo)正在滾動。如果你還在外層網(wǎng)格里再包了一個 ScrollViewer情況就更復(fù)雜兩層滾動容器都在爭搶這個事件。注意即使內(nèi)層 DataGrid 不顯示滾動條只要它的 ScrollViewer 存在它依然會攔截鼠標(biāo)滾輪事件。因為 DataGrid 默認(rèn)模板里就包含一個 ScrollViewer這個內(nèi)部結(jié)構(gòu)始終存在只是滾動范圍不夠時滾動條不可見而已。1.2 真的是 DataGrid 在“吃”事件嗎不完全是。真正動手處理事件的不是 DataGrid而是它模板里的 ScrollViewer。理解這一點很關(guān)鍵因為所有解決方案本質(zhì)上都是圍繞“內(nèi)層 ScrollViewer 如何處理滾輪事件”和“外層 ScrollViewer 如何感知滾輪事件”展開的。我可以做一個簡單的實驗來驗證在最外層窗口的 PreviewMouseWheel 事件里加一個調(diào)試輸出斷點或日志然后把鼠標(biāo)放在子 DataGrid 上滾動滾輪。你會發(fā)現(xiàn)在 PreviewMouseWheel 階段事件是可以被捕獲到的但在 MouseWheel冒泡階段事件上外層的處理程序不會觸發(fā)。這表明隧道階段確實經(jīng)過了外層但事件在冒泡過程中被內(nèi)層處理并止步了。我們最終要做的就是在事件冒泡被內(nèi)層“終結(jié)”之前通過特殊機制把事件繼續(xù)傳送給外層滾動容器或者是直接接管子層級的滾輪事件自己判斷何時滾動內(nèi)層、何時滾動外層。2. 三種主流解決方案對比我先后嘗試了三種方案在可控性、代碼量、侵入性上有明顯差異。我建議你先看方案二它在大多數(shù)場景下最省事而且不破壞內(nèi)部結(jié)構(gòu)的默認(rèn)行為。方案核心思路優(yōu)點缺點適用場景方案一滾動到邊界后手動觸發(fā)外層滾動監(jiān)聽子表格的 ScrollChanged 事件判斷是否到達邊界再手動滾動外層容器邏輯直觀代碼少需要手動綁定外層容器的名字多嵌套時較繁瑣單層嵌套界面結(jié)構(gòu)固定方案二自定義附加行為Behavior在內(nèi)層滾動到邊界時動態(tài)尋找父級 ScrollViewer并向父級模擬發(fā)送滾輪事件無需業(yè)務(wù)代碼侵入復(fù)用性高實現(xiàn)稍復(fù)雜需要理解附加屬性和可視化樹通用場景推薦優(yōu)先使用方案三重寫 OnMouseWheel在子 DataGrid 的子類中重寫 OnMouseWheel 方法手動處理邊界穿透面向?qū)ο笏悸愤m合每個子表格獨立定制必須創(chuàng)建子類使用范圍受限于某一種控件僅針對特定 DataGrid 子類的局部需求這里手動給三種方案排個序日常開發(fā)優(yōu)先用方案二因為它是非侵入式設(shè)計一個附加屬性掛上去就能解決多層嵌套問題如果你的場景非常簡單只嵌套了一層方案一也完全夠用方案三適合需要深度定制滾動行為的場合比如子表格擁有獨立的滾動邏輯而不是簡單透傳給父級。3. 基于附加行為的通用解決方案3.1 實現(xiàn)思路拆解方案二的設(shè)計意圖很清晰要讓內(nèi)層滾動容器在不能繼續(xù)滾動時把當(dāng)前的滾輪事件“轉(zhuǎn)交”給外層的滾動容器。核心難點在于“什么時候算不能繼續(xù)滾動”以及“怎么轉(zhuǎn)交”。第一部分判斷何時到達邊界。內(nèi)層 ScrollViewer 的 VerticalOffset 等于 0 時說明滾到頂部等于 ScrollableHeight 時說明滾到底部。注意 ScrollableHeight 是指內(nèi)容的實際可滾動高度不是 ExtentHeight。這兩個值都來自 ScrollViewer 的實時依賴屬性。第二部分如何轉(zhuǎn)交事件。在到達邊界后如果只是讓事件繼續(xù)冒泡結(jié)果是無效的因為內(nèi)層 ScrollViewer 已經(jīng)把 Handled 標(biāo)記成了 true。我們需要的就是重新創(chuàng)建一個新的 MouseWheelEventArgs或者在隧道階段提前處理繞過內(nèi)層 ScrollViewer 的“已處理”狀態(tài)。第三部分找到父級 ScrollViewer 的方法。這里不能直接用 VisualTreeHelper 無限向上遍歷到根節(jié)點因為可能有多層嵌套也可能 DataGrid 外面根本沒有 ScrollViewer。需要做的是“就近查找”向上遍歷可視化樹找到第一個 ScrollViewer 類型并且是被用來滾動外層內(nèi)容的那個一般是外層 DataGrid 的 ScrollViewer或者手動包的外層 ScrollViewer。判斷滾動到頂部的邏輯要注意邊界條件當(dāng) ScrollableHeight 為 0 時內(nèi)容高度小于可視高度此時滾動條根本不能滾動。如果還強行向上拋事件會造成外層莫名其妙地抖動。所以一定要加一個條件ScrollableHeight 0 時才執(zhí)行邊界判定。3.2 附加屬性代碼實現(xiàn)我選擇實現(xiàn)為一個附加屬性掛載到 DataGrid 或者 ScrollViewer 上都行??紤]到 DataGrid 的 ScrollViewer 是模板內(nèi)部生成的附加屬性掛在 DataGrid 上更直接一點。using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; public static class ScrollViewerBehavior { public static readonly DependencyProperty EnableMouseWheelTransferProperty DependencyProperty.RegisterAttached( EnableMouseWheelTransfer, typeof(bool), typeof(ScrollViewerBehavior), new PropertyMetadata(false, OnEnableMouseWheelTransferChanged)); public static bool GetEnableMouseWheelTransfer(DependencyObject obj) { return (bool)obj.GetValue(EnableMouseWheelTransferProperty); } public static void SetEnableMouseWheelTransfer(DependencyObject obj, bool value) { obj.SetValue(EnableMouseWheelTransferProperty, value); } private static void OnEnableMouseWheelTransferChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is DataGrid grid) { if ((bool)e.NewValue) { grid.AddHandler(UIElement.MouseWheelEvent, new MouseWheelEventHandler(OnMouseWheel), true); } else { grid.RemoveHandler(UIElement.MouseWheelEvent, new MouseWheelEventHandler(OnMouseWheel)); } } } private static void OnMouseWheel(object sender, MouseWheelEventArgs e) { var grid sender as DataGrid; if (grid null || e.Handled) { return; } var scrollViewer FindVisualChildScrollViewer(grid); if (scrollViewer null) { return; } double offset scrollViewer.VerticalOffset; double maxOffset scrollViewer.ScrollableHeight; if (offset 0 e.Delta 0) { // 向上滾到頂端把事件拋給父級 TransferEventToParentScrollViewer(grid, e); return; } if (offset maxOffset e.Delta 0) { // 向下滾到底部把事件拋給父級 TransferEventToParentScrollViewer(grid, e); return; } } private static void TransferEventToParentScrollViewer(DependencyObject child, MouseWheelEventArgs originalArgs) { var parent FindParentScrollViewer(child); if (parent ! null) { var newArgs new MouseWheelEventArgs(originalArgs.MouseDevice, originalArgs.Timestamp, originalArgs.Delta) { RoutedEvent UIElement.MouseWheelEvent, Source originalArgs.Source }; parent.RaiseEvent(newArgs); originalArgs.Handled true; } } private static ScrollViewer FindParentScrollViewer(DependencyObject child) { DependencyObject current VisualTreeHelper.GetParent(child); while (current ! null) { if (current is ScrollViewer) { return current as ScrollViewer; } current VisualTreeHelper.GetParent(current); } return null; } private static T FindVisualChildT(DependencyObject obj) where T : DependencyObject { for (int i 0; i VisualTreeHelper.GetChildrenCount(obj); i) { DependencyObject child VisualTreeHelper.GetChild(obj, i); if (child is T t) { return t; } T result FindVisualChildT(child); if (result ! null) { return result; } } return null; } }代碼中有幾個關(guān)鍵點需要逐一說清楚。AddHandler 的第三個參數(shù)傳 true表示即使事件已經(jīng)被標(biāo)記為 Handled也能在監(jiān)聽表單上收到事件。這就是為什么選擇用 AddHandler 而不是直接在 DataGrid 的 MouseWheel 事件上掛處理器。因為內(nèi)層 ScrollViewer 處理完后 Handled 已經(jīng)是 true用常規(guī)的事件訂閱方式根本不會進入我們的回調(diào)。找到內(nèi)層 ScrollViewer 用的是 FindVisualChild它是深度優(yōu)先遞歸查找。需要注意的是 FindVisualChild 先查直接子元素再遞歸如果 DataGrid 模板里有多個 ScrollViewer拿到的是第一個不過在實際情況下一個 DataGrid 內(nèi)部滾動容器只有一個基本不會有歧義。至于向父級傳遞事件這一步不能直接把 originalArgs 重新 RaiseEvent因為該事件已經(jīng)走完了一次完整的路由生命周期復(fù)用它會導(dǎo)致路由信息混亂。正確的做法是新建一個 MouseWheelEventArgs把 Delta、MouseDevice、Timestamp、Source 都復(fù)制過去再以父級 ScrollViewer 作為 Source 來重新觸發(fā)這樣才能讓父級滾動容器像收到原生事件一樣正常響應(yīng)。3.3 XAML 中的掛載方式把這個附加屬性用到界面上非常簡單就是在內(nèi)層 DataGrid 上加上一行代碼。Grid ScrollViewer DataGrid x:NameOuterGrid AutoGenerateColumnsFalse ItemsSource{Binding OuterItems} DataGrid.Columns DataGridTemplateColumn Header詳情 DataGridTemplateColumn.CellTemplate DataTemplate DataGrid ItemsSource{Binding InnerItems} AutoGenerateColumnsFalse local:ScrollViewerBehavior.EnableMouseWheelTransferTrue DataGrid.Columns DataGridTextColumn Header子項名稱 Binding{Binding Name}/ DataGridTextColumn Header子項數(shù)量 Binding{Binding Count}/ /DataGrid.Columns /DataGrid /DataTemplate /DataGridTemplateColumn.CellTemplate /DataGridTemplateColumn /DataGrid.Columns /DataGrid /ScrollViewer /Grid注意我這里外層也套了一個 ScrollViewer原因是如果外層 DataGrid 的滾動條正常情況下不可見你可能需要手動包一層 ScrollViewer 來確保外層可滾動。當(dāng)你啟用了附加屬性后鼠標(biāo)在內(nèi)層子網(wǎng)格上滾到頂部或底部多余的滾動量就會自動轉(zhuǎn)移到外層容器上。兩者的滾動方向保持一致體驗會很自然。有一點要提前說主從表格的滾動高度要銜接得上否則會出現(xiàn)“中間有一段空白滾不動”的斷裂感。比如內(nèi)層表格內(nèi)容特別長但外層某一行高度有限滾動時內(nèi)層滾完了、外層還沒到下一個位置可能就會短暫卡頓。這個和方案本身的正確性無關(guān)更多是布局設(shè)計要配合好。4. 直擊邊界的判斷邏輯細節(jié)邊界判斷是整個解決方案的“魂”。如果判斷不準(zhǔn)很容易出現(xiàn)一種奇怪現(xiàn)象鼠標(biāo)在內(nèi)層滾輪滾到中間位置時若繼續(xù)向上外層突然開始跟著動但內(nèi)層其實還有向上空間。這顯然是誤判了邊界條件。正確的判斷邏輯要考慮兩個因素滾輪方向和滾動偏移量。向上滾輪事件是 Delta 大于 0向下是 Delta 小于 0。邏輯應(yīng)該是方向向上且當(dāng)前位置在頂部或方向向下且當(dāng)前位置在底部這兩種情況才把事件拋給父級。如果內(nèi)層還在可滾動范圍內(nèi)就讓內(nèi)層自己消化。有朋友可能會問外層滾動容器在邊界繼續(xù)滾會怎樣答案是不會有效果因為外層 ScrollViewer 自己也有邊界。所以當(dāng)內(nèi)層在最底部時往下滾外層如果也在最底部這個重新拋出的事件到達外層后外層也不會發(fā)生滾動這是正?,F(xiàn)象。還有個小細節(jié)有時候 HorizontalOffset 也要處理。如果內(nèi)層 DataGrid 寬度超過可視區(qū)域會出現(xiàn)橫向滾動條這時候鼠標(biāo)滾輪不應(yīng)該操作橫向滾動。但 Windows 常規(guī)的縱向滾輪事件即使在一個橫向可滾動的區(qū)域里默認(rèn)邏輯也是操作縱向滾動。所以我們保持默認(rèn)行為就好不必去額外處理橫向滾動。關(guān)于 ScrollableHeight 的邊界條件我踩過一個具體的坑當(dāng)某一行內(nèi)層表格內(nèi)容為空比如 ItemsSource 是空集合ScrollableHeight 會返回 0。這時如果用戶在空表格區(qū)域滾動滾輪事件既不會讓內(nèi)層滾動因為無內(nèi)容可滾也不會傳給父級因為 offset 0 且 Delta 0 條件成立但 maxOffset 為 0offset maxOffset 成立向下滾動時會傳遞。但如果是向上滾動offset 0 且 Delta 0也會傳遞。這其實是合理的空表格區(qū)域滾輪交給父級沒問題。真正有問題的場景是內(nèi)層內(nèi)容很少ScrollableHeight 剛好等于某個非零值且當(dāng)前 offset 恰好等于 maxOffset。這時候往下滾我們會以為到頭了把事件拋給父級但如果父級此時有較大滾動余量是沒問題的如果父級一開始就在底部那自然沒有多余滾動也合理。所以這個邏輯是自洽的。5. 多層嵌套和動態(tài)加載數(shù)據(jù)時的表現(xiàn)項目需求很少會只嵌套一層更常見的情況是外層表格的某一列下面又有子表格子表格里還有子表格形成三層甚至更多層的結(jié)構(gòu)。附加方案的查找邏輯是“就近找父級 ScrollViewer”所以多層嵌套時需要對查找邏輯做一點增強。像上面 FindParentScrollViewer 的寫法從內(nèi)層網(wǎng)格向上找找到的第一個 ScrollViewer 可能是中間某一層的外層容器。如果還要繼續(xù)向上拋給更上層這個實現(xiàn)就只處理了一層。要做完整的多層傳遞可以寫一個循環(huán)或遞歸查找連續(xù)把所有父級 ScrollViewer 都找出來逐個判斷邊界。我的做法是改成收集一路向上所有的 ScrollViewer每層都判斷一次邊界層層向上傳遞直到某個父級還能繼續(xù)滾動或者沒有更多父級為止。這樣代碼量增加得不多但對復(fù)雜嵌套的適應(yīng)性大幅提升。另外動態(tài)加載數(shù)據(jù)也是一個需要注意的場景。當(dāng) ItemsSource 綁定的集合發(fā)生變更DataGrid 會自動刷新。此時內(nèi)層 ScrollViewer 的垂直偏移量可能會自動重置為 0。如果你在滾動過程中更新了數(shù)據(jù)源那么邊界判斷就可能基于新的狀態(tài)進行表現(xiàn)上可能會出現(xiàn)一次突然的跳變。這個不是解決方案的問題而是數(shù)據(jù)刷新本身的影響。實際操作中如果數(shù)據(jù)刷新很頻繁建議在刷新前記錄滾動位置在數(shù)據(jù)更新后再恢復(fù)對用戶體驗會友好很多。// 獲取滾動位置的輔助方法 public static double GetVerticalOffset(DataGrid grid) { var sv FindVisualChildScrollViewer(grid); return sv?.VerticalOffset ?? 0; } // 恢復(fù)滾動位置的輔助方法 public static void SetVerticalOffset(DataGrid grid, double offset) { var sv FindVisualChildScrollViewer(grid); if (sv ! null) { sv.ScrollToVerticalOffset(offset); } }這個輔助方法在數(shù)據(jù)刷新前保存 offset數(shù)據(jù)刷新后再恢復(fù)能避免很大的體驗撕裂感。6. 不使用附加屬性時的簡化版本如果你只是臨時處理一個頁面不想引入附加屬性類也可以采用方案一。我寫一個簡化版代碼直接在內(nèi)層 DataGrid 的 MouseWheel 事件上處理配合外層 ScrollViewer 的引用。private void InnerDataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e) { var grid sender as DataGrid; if (grid null) return; var innerScrollViewer FindVisualChildScrollViewer(grid); if (innerScrollViewer null) return; var outerScrollViewer OuterScrollViewer; // 外層 ScrollViewer 實例引用 double offset innerScrollViewer.VerticalOffset; double maxOffset innerScrollViewer.ScrollableHeight; if ((offset 0 e.Delta 0) || (offset maxOffset e.Delta 0)) { var newArgs new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta) { RoutedEvent UIElement.MouseWheelEvent, Source outerScrollViewer }; outerScrollViewer.RaiseEvent(newArgs); e.Handled true; } }要注意這個寫法用的是 PreviewMouseWheel原因是在隧道階段攔截事件趕在內(nèi)層 ScrollViewer 處理之前拿到事件這樣 e.Handled 的控制權(quán)就掌握在我們手里。如果用 MouseWheel 冒泡事件由于內(nèi)層 ScrollViewer 已經(jīng)提前處理我們收到的 e.Handled 已經(jīng)為 true再想傳遞給外層就會很別扭。這種寫法適用于頁面比較固定、層級比較簡單的項目。缺點是外層容器名字寫死在事件處理器里如果界面重構(gòu)或者外層 ScrollViewer 換掉代碼可能連帶失效。只適合“一次需求、臨時解決”的快速場景。7. 常見問題與排查記錄這個方案我前后在好幾個項目里用過也遇到各種各樣盤外招一樣的問題。我把遇到過的典型問題都記錄下來做個速查表方便遇到同樣現(xiàn)象時快速定位。問題現(xiàn)象可能原因排查思路解決辦法滾輪事件完全沒有響應(yīng)日志里也看不到任何事件事件被其他元素提前攔截或者 DataGrid 沒有真正獲得鼠標(biāo)焦點在窗口的 PreviewMouseWheel 掛鉤子打印日志確認(rèn)是否到達窗口層檢查是否有元素設(shè)置了 IsHitTestVisibleFalse 或者有透明覆蓋層擋住了 DataGrid滾到邊界后外層也不滾動外層 ScrollViewer 同樣在邊界或者父級查找邏輯寫錯斷點查看 FindParentScrollViewer 返回的是哪個 ScrollViewer確認(rèn)外層確實存在可滾動余量否則現(xiàn)象正常內(nèi)層還沒滾動到邊界外層卻提前滾動了事件在 PreviewMouseWheel 階段被重復(fù)處理或者附加屬性應(yīng)用到了外層 DataGrid 上檢查是否給所有 DataGrid 都掛了附加屬性只給內(nèi)層嵌套 DataGrid 添加附加屬性滾動方向完全相反把 Delta 正負判斷寫反了打日志查看 e.Delta 符號和想要的滾動方向修正判斷條件向上滾動 Delta 大于 0點擊內(nèi)層表格的滾動條時仍然無法滾動外層通過滾動條拖動滾動的事件類型不是 MouseWheel而是 ScrollBar 自身的滾動命令滾動條拖拽屬于 Thumb 拖拽范圍無法靠 MouseWheel 事件處理如果期望拖動內(nèi)層滾動條時外層跟隨需要額外監(jiān)聽 ScrollBar.Scroll 事件數(shù)據(jù)刷新后內(nèi)層滾動位置跳回頂部DataGrid 在 ItemsSource 重置時自動歸零滾動位置檢查數(shù)據(jù)綁定是否頻繁刷新刷新前后手動保存/恢復(fù) VerticalOffset有一個比較隱蔽的問題值得單獨說一下如果你的外層 DataGrid 打開了行虛擬化那么內(nèi)層 DataGrid 在滾動過程中會被銷毀重建。這時 FindVisualChild 可能拿到一個剛剛創(chuàng)建的實例滾動偏移量是 0邊界判斷會誤以為當(dāng)前位置在頂部/底部導(dǎo)致事件較早就拋給了外層。這種問題往往表現(xiàn)為內(nèi)層數(shù)據(jù)明明還有很長一頁滾動時卻一頓一頓地往外層跳。解決方法是避免在內(nèi)層 DataGrid 開啟虛擬化或者在外層行 VirtualizationMode 設(shè)置為 Recycling 時做額外的滾動位置校驗。在絕大多數(shù)嵌套場景中內(nèi)層 DataGrid 數(shù)據(jù)量不大關(guān)閉虛擬化導(dǎo)致的性能損耗可忽略不計。我在外層 DataGrid 上設(shè)置 EnableRowVirtualizationFalse 后此類問題就很少出現(xiàn)了。前提是確認(rèn)外層數(shù)據(jù)量本身不大否則會有卡頓風(fēng)險。開啟虛擬化的情況下ScrollViewer 的 ExtentWidth 和 ViewportWidth 也會動態(tài)變化。邊界判斷依賴的 ScrollableHeight 會受到這些值影響。如果你堅持開著虛擬化建議在 ScrollChanged 事件中實時同步記錄 offset然后用記錄值做判斷不要用臨時的實時值。8. 擴展方向是否要處理觸控屏和慣性滾動到這一步主方案的代碼和常見情景都能覆蓋了。但還有一類容易被忽略的使用場景觸控屏上的手勢滑動操作。觸摸滾動走的是不同于 MouseWheel 的另一套機制Manipulation 操作所以這套附加屬性的代碼在觸屏設(shè)備上不會觸發(fā)。我在某個項目里確實遇到過用戶拿觸屏操作時滾動無效的情況。解決方案是在內(nèi)層 ScrollViewer 上監(jiān)聽 ManipulationBoundaryFeedback 事件當(dāng)觸摸操作到達滾動邊界時把這個反饋事件傳給外層容器。這個事件專門用于觸控操作到達容器的邊界時給出持續(xù)的反饋提示默認(rèn)表現(xiàn)是一條波浪線。我們用同樣的附加屬性思路在到達邊界時把 Manipulation 事件轉(zhuǎn)交出去觸屏上也能有流暢的滾動體驗。grid.AddHandler(UIElement.ManipulationBoundaryFeedbackEvent, new ManipulationBoundaryFeedbackEventHandler(OnManipulationBoundaryFeedback), true); private static void OnManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e) { var grid sender as DataGrid; if (grid null) return; var parent FindParentScrollViewer(grid); if (parent ! null) { parent.RaiseEvent(e); e.Handled true; } }另外鼠標(biāo)滾輪平滑滾動部分鼠標(biāo)驅(qū)動支持的高分辨率滾動事件在有些電腦上 Delta 數(shù)值比較小而頻率很高此時拋給外層的邏輯依然成立但要注意不要每次小數(shù)量的 Delta 都構(gòu)造新事件那樣會有大量事件產(chǎn)生??梢栽诟郊訉傩詢?nèi)部加一個簡單的時間窗口過濾例如每 30 毫秒最多向外層轉(zhuǎn)交一次真正的滾動操作。9. 寫在最后的實操心得這個坑我在不同項目里掉進去過兩次第二次才徹底把附加屬性的方案沉淀下來。以我的經(jīng)驗來看這個方案最大的價值不在于“能用”而在于它不依賴具體的界面命名也不影響原有數(shù)據(jù)綁定換成任何一種復(fù)雜的嵌套結(jié)構(gòu)都能快速掛載幾乎不需要改動既有業(yè)務(wù)代碼。給后來者三個建議。第一先確認(rèn)你的場景真的是“嵌套導(dǎo)致的事件攔截”最簡單的驗證方式是在外層容器掛一個 MouseWheel 事件處理器看鼠標(biāo)在內(nèi)層區(qū)域滾動時它是否觸發(fā)。如果在 PreviewMouseWheel 階段能觸發(fā)在 MouseWheel 階段不觸發(fā)基本可以鎖定方向。第二附加屬性的核心在于 AddHandler 的第三個參數(shù)一定要傳 true這是繞過 Handled 標(biāo)記的關(guān)鍵。第三一旦遇到多層嵌套或者動態(tài)數(shù)據(jù)的場景優(yōu)先考慮多層傳遞方案和滾動位置恢復(fù)的策略否則調(diào)試起來會很痛苦。這個解決方案我在多層級嵌套表格項目、主從明細展示頁、自定義報表中反復(fù)驗證過滾輪傳動的連貫性基本能達到原生滾動的手感。如果你還有諸如“多層互相嵌套但中間層也需要獨立滾動”之類的進階需求思路也類似無非是在層與層之間做好事件傳遞鏈。希望這篇文章能讓你少走彎路一次搞定。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
六月丁香五月婷婷| 欧美黑人精品一区二区| 97网色| 91白虎| 国产丝袜美女诱惑| 伊人色综合超碰| 中文字幕成人理论在线| 男女91| 色色五月天婷婷| 国产一级内射无挡观看| 天天亚洲| 欧美色吧综合| 91nbbbbbb| 伊人大香蕉在线| 婷婷天堂站| 综合操逼| 92午夜免费福利视频| 亚洲 欧美 日韩 国产一区二区| 老女人碰碰在线碰碰视频| 99国产精品人妻人伦| 免费在线观看AV无码网站| 黄视频免费| 在线中文字幕视频| 乱伦熟妇一区二区| 老司机午夜精品视频| 9 1果冻精品视频| 午夜九九| 好湿好紧视频| 日韩精品一区二区人人人| 日韩综合97P| 欧美成人亚洲精品| 国产精品亚洲四五区在线观看| 婷婷五月天综合网| 欧美在线官网| 色综合99999| 精品视频97| 午夜后入| 后入式999| AV色五月天| 极品久久久久久久久久久久久久| 96免费视频在线| 精品人妻一区二区免费蜜桃| 美腿丝袜偷拍亚洲欧美| 日韩精品9999| 青青青草原| 超碰九区| 吖在线不卡一区二区国产剧情| 老熟女乱伦片| 18禁超污无遮挡无码免费网| 欧美激情超碰777| 九X超碰| 日韩99神马视频片| 丝袜狠狠草尤物 91| 欧美伦乱爱| A一级色女| 中字一区| 久久久日本电影| 大香蕉78| 欧美另类精品xxxx| 丁香色色网| 精品女人999| 做爱福利视频一区二区| 亚洲一区中文字幕| www.亚洲成人一区| 日韩99999色| 97超碰逼| 久久久久久久久999| AV在线性爱| 日本精品不卡一二三区| 97大色网| 日韩99999| 无遮挡一级毛片视频免费的| 亚洲 欧美日韩 另类| 五月丁香综合啪啪| 91强在线播放| 九九无码| 欧美日韩中文亚洲v在线综合| 99ri视频| 天天综合网亚洲综合网| 欧美一级黄片视频在线| 五月婷婷色| 午夜精品久久久久| 激情欧美97| 两性色网| 精品176精品2| 欧亚日韩一区在线| 97超级色碰碰| 精品黄色电影| 国产老熟女| 精品国产乱码久久久| 日本三级A片网站com| av一区二区三区 中文| 爱爱久久| 日韩综合成人免费视频| 宅男午夜在线视频| 大二网站亚洲| 蜜桃视频一区二区三区在线观看| 亚洲情色综合| 97精品国产97久久久| 天综合网欧美| 日本色色视频网站| 少妇同性| 人人操人人摸人人看人人干| 亚洲aw毛茸茸在线| 久久久久国产精品久久久| 婷婷AV一区二区三区| 日本不卡高清免v欧美日韩在线观看| 蜜臀99精品国产高清在线观看| 欧美黑人精品在线播放| 极品AV网站在线观看| 亚洲精品国语在线播放| 99re这里只有精品中心播放 | 97国产天堂岛| 日韩性爱一级片| caorenqi shipin| 国产精品97视频| 亚洲福利中文字幕在线| 国产精品69久久久久孕妇欧美| 八戒无码国产午夜福利| 人人澡人人弄| 国内毛片婷婷六月色| 欧美性爱一区二区三区四区 | 91人妻人人妻| 粉嫩av在线| 欧美日韩高潮喷水91| 天天做天天爱| 97免费视频网| 蜜乳Av成人片网站| 职场同事知名国产国产精品久久欧美日韩| av无码精品久久久久| 农村妇女精品一区二区| 欧美大香蕉专区网| 97国产|免费| 又大又白奶子| 国产亚洲禁久一区二区| 97视频播放| 中文字幕 一区二区 亚洲无码| 78精品| 国内精品不卡无毒99999| 中文字幕在线观看网址| 婷婷香网站| 国产树林里野战在线看| 久久97超碰| 蜜色网色哟哟| 国产精品极品美女视频| 国产乱码久久久| 久久婷婷国产一区二区色| 久久69| 久久精品老司| 九月婷婷久久| 日本伦乱九九九综合| 欧洲一区二区三区免费| 国产亚洲一黄| 日本精品无码三级网站| 久久久久久久免费A片国产成a人亚洲精∨品无码| 99久久无色码| 国产av美女被艹的乱叫| 亚洲色图欧美色图另类图片| 女人的天堂大香蕉网| 亚洲乱熟女一区二区| 五月天综合| 精品九九九九| 91热色| 久久人妻四季| 操逼逼无码| 亚欧高清| 热热色中文无码| 香蕉免费一区二区三区不读 | 亚洲欧美爆| 午夜精品久久久久久久99蜜桃一| 强被迫伦姧在线观看无码网站| 成人精品视频| 少妇同性| 国产欧美精品日韩区二区麻豆天美| 最新三级网址| 久久五十路熟女人妻| 丝袜美腿91| 美女大乳久久久久久久女人18| 日本精品一区二区中文字幕| 欧美一级美片在线观看免费| 麻豆精品.欧美精品.日韩精品.| 97综合国产精品高潮久久| 婷婷五月天久久久| 丁香六月婷婷| 国产一区二区在线电影| 精品视频免费在线一区| 亚洲中文字幕在线视频一区二区| 午夜啊啊| 中文字幕视频二区| com 首页 18岁 禁区 女优 免费 精选 同城 | 免费簧片在线观看| 国产家庭乱伦性爱视频| 日本操逼视频免费| 人人看人人插| 乱伦一二三| 中文字幕乱码在线观看| 天天欧美| 日韩猛交| 欧美天天弄| 夜夜欧美 | 国产版a级片直播在线| 都市久久精品激情亚洲| 欧美精品23| 日本国产欧美一区三区二区| 日韩欧美日韩| 91精品国产91久久青草| 天天干人人看综合| 一级做受视频免费是看美女| av黄图片在线观看| 国产精品久久aV| 一级人妻性爱视频| 国产人妖的免费的视频| 一级aaaaa欧美中文字幕录像片| 亚洲天堂中文字| 国产成人精品必看| 欧美日韩国产色图在线| 国产日本熟女顶级一区二区三区视频| 综合国产97| 操人妻丝袜高跟| 熟女日韩| 日韩中文字幕2020| 91AV国产精品| 日本人妻伦在线中文字幕| 欧美岛国精品在线观看| 国产久久成人| 91精品国产麻豆国产自产在| 亚洲天堂电影精品一区| 综合天天网| 午夜操操操| 青青五月天| 中欧人妻丝袜中文字幕| 久久精品久久久久久久久| 国产精品视频麻豆入口| 日韩有码回春沙龙第一页| 98超碰日本| 丰满熟妇大乳做爰| 国产精品懂色tv影视免费观看| 啪啪视频免费在线观看| 综合操逼| 国产馆极品诱惑| 久热久操| 玖玖爱在线视频免费观看| 亚洲天堂AV在线播放| 久色网| 久久大香蕉手机高清| 男人的天堂色偷偷青青草视频婷婷网| 9.1小视频| 欧美第二页| 熟女乱伦A| renqi久久久久久久久久久久| 第45页一区二区| 色97综合中文字幕| 久96热在线观看视频| 啪啪资源网| 国模一区二区三区| 91AV天美在线视频| 国产辣妈在线视频福利| www.99视频| 亚州色国| 高清在线不卡一区二区 视频| www.人人cao| 久久97资源 网| 91操熟女视频| 免费看日本操逼视频| 啪啪91| 老鸭窝成人| 久久精品国产AV一区二区三区| 国产精品爽爽va在线观看98| 大香蕉99热| 97在线免费看视频| 欧美丰满熟妇XXXX性ppX人交| 91 国产丝袜在线放观看| 天天干1区2区在线| 国产成人亚洲精品无码古代早漏男| 96AV精品| 日本熟妇人妻一区二区三区| 玖玖资源综合在线视频| 97久久超碰国产网站| 少妇无码999| 久久国内| 中国的操老妇女| 精品日韩人妻视频| 欧美成人亚洲精品| av激情亚洲五月天| 久久超碰久| 91日韩网站| 蜜乳AV网址| 免费超碰97久久| 一本色道综合久久欧美| 久久亚州高清| 国产精品无码论坛| 少妇久久久免费| 久操网址| 四虎影视永久在线观看精品免费网站| 亚洲系列第一页| 九一综合网| 777AV电影| 一区| 性爱乱伦网址| 久久久久久久久久久久97| 99久在线精品99re8热| 91麻豆天美国产欧美高潮| 性爱乱伦网址| 男人天堂新在线| 97网址www| 欧美精品二区视频在线| 97超碰亚洲| 欧美日韩国产黄色片| 欧美日韩婷婷中文| 蜜桃无码AV一区二区| 欧美图片校园春色| 97国产色综合| 尤物视频一区| 国产蜜臀在线| 欧美亚洲性爱一区二区| 岛国片在线视频网站| 人妻少妇久久中文字幕一区二区 麻豆 | 精品超碰中文在线| 少妇厨房愉情理伦片bd在线观看| 操一区| 色噜噜人妻丝袜a∨先锋影| 性高潮久久久久久久久久久| 亚洲熟妇丝袜在线观看| 睡产熟女乱伦| 国产深夜福利| 东京热熟女亚洲视频网站| 中国女人内射6XXXXX| 天天操熟妇| 国产按摩一区二区三区| 日韩在线地址一| 国产日韩中文字幕欧美| 天天射网| 8050无码八戒| 91影库| 婷婷8月天青娱乐| 日本丝袜美腿人妻九九| 色婷婷久久| 欧美性爱18观看| 新怡红院| 色香综合天天影视综合| 精品国产一区二区三区久久久蜜臀 | 欧美日韩香蕉| 精品99999| rivers-china.com| 国产成人主播| 天美麻豆精品视频99| 黄色一区二区秘书性感| 91中出| 中出人妻中文字幕91在线| 江都AV在线| 影音先锋国产精品| 日韩三级天堂在线观看| 20cm女自慰在线日韩欧美| av2014 日韩在线中文字幕| 67914在线精品观看| 日本人人操人人操| 一本大道不卡一二三区| 亚洲无码超碰免费| 国产精品直播在线观看直播| 欧洲综合色| 男人天堂久久精品不卡| 金典av| 午夜性| WWW4虎| 亚洲精品99| av在线资源| 亚洲暴力强奸AV| 成人无遮挡毛片免费看| 中文?日韩?免费?精品| 蜜区区视频79 | 欧美影院一区二区三区| 香蕉视频精品亚洲一区二区三区在线播| 欧美91网站| 91丨国产丨白浆| 殴美色网| 亚洲情色图片区| 黄污污污污| 国产成人在线观看综合| 国产一区二区在线电影| 夜夜高潮夜夜爽高清视频一| 九九性爱网| 亚洲天堂7777| 乱伦日本色图AⅤ| 久久国产热视频97电影| www.伪伪| 女人爽到高潮潮喷18禁网站| 久久99精品视频| 亚洲一区中文字幕一区| 天无日色综合| 91 丝袜在线| 日韩午夜国产| 97超碰总站| 国产精品乱码久久久、久久| 亚洲脚交| 久久精品久| 九七超碰| 亚洲日本激情| 黄色大香焦1级‘′‘| 操逼啊啊啊91| 日本三级R| 久久97| 免费看美国人人爽,人人操| 精品妇女一区二区三区| 黄色小说亚洲| 欧美一二级| 人妻另类| 乱伦一二三区| 午夜福利视频在线一区| 91视频国品一二三区| 久久色一区| 欧美传媒一区| 色噜噜国产精品视频一区二区| 亚洲图片激情小说| 岛国大片国产| 色色综合网站| 国产成人主播| 啪啪啪男女亚洲中文字幕99| 色综合国产在线观看| 美女一区二区国产精品| 天无日色综合| 加勒比性爱成人在线| 亚洲综合伊人无码久久| 午夜福利激情在线视频| 国产日比| 欧美色图在线视频少妇| 男人天堂网站| 久久久精品视频免费观看| 99色| 男人的天堂无码| 亚洲美女AV无码| 国产精品久久久久中文字幕| 炮色五月| 精品十八在线观看| 国产精品女生av| 人妻熟女字幕一区二区| 校园春色欧美| 强奸乱伦AV一天堂网| 日本岛国黄色网址| 亚洲无限观看| 日欧操屄| 麻豆久久久久久久久丝袜 | 亚洲欧洲综合视频在线| www.男人天堂| 丁香五六月啪啪| 一二三四区电影| 日韩偷拍一区二区三区| 亚洲……91| 精品少妇高潮久久| 国产尤物AV尤物在线观看不卡| 99国产在线绯色一区| 天天网综合| 久99热| com 首页 18岁 禁区 女优 免费 精选 同城| 91视频综合网| 一本道综合色图| 欧美桃色网| 国产69精品久久久久99尤物| 1204av韩国| 五月天我淫我色av| 亚洲 欧美 另类 综合 偷拍| 日韩97| 亚洲有码 欧美精品| 久热这里只有精品9| 小情侣高清国产在线视频| 欧美 牲| 日韩欧美成人综合在线| 北京美女一区二区| 欧美黄片免费在线观看视频| 青草香蕉网| 操逼日批| 欧美色综合图片| 色官网色综合| 中出20p| 制服乱伦| 九九九九热| 好爽,再快点啊哈嗯嗯嗯嗯| 99999精品| 久久国产视频专区一二三| 超碰97精品| 蜜臀AV成人精品蜜臀AV久久| 人人干黄色| 日本大香蕉| 把腿张开老子CAO烂你| 日韩淫色网| 精品国产精品一区二区| 亚洲不雅视频1区二区| 俺去久久| 超碰人妻天天干| 丁香7月婷婷| 五月丁香网站| 岛国黄片网站| 色噜噜狠狠色综无码久久| 婷婷久月| 小说区 图片区色 综合区| 久久欧洲| 97干在线| 国产精品亚洲色婷婷久久久| 久久精品人妻一区二区| 一色网男人的天堂| 超碰成人公开| 欧美劲爆第一页| 国产天天看| 国内自拍 日韩激情 99| 日本中文熟女视频| 日夜尻逼网| 精品福利视频| 国产成人精品日本亚洲语言| 欧洲性爱无码区| 亚洲青青草| 欧美日日网| 国产精品自在线发布| 92久久| 亚洲欧美日韩国产丝袜自拍中文| 色婷婷在线视频| 久久精品久久九九精品| 外国91| 天天影视之亚洲综合网| 久久久久久久少妇| 激情专区综合| 久久久久久日韩| 久久久日本电影| 操淫穴亚洲五月丁香| 日韩无码嘿咻黑热久| 婷婷激情五月天小说网| 亚洲春色欧美激情自拍| 九九九网站| 大香蕉日亚洲日本亚大 | 亚洲风情在线观看| 91激情国产| 亚洲大色堂| 超碰调教97| 国产AV高清AV无码| 视频国产精品未满十八禁止在线观看| 人妻夜夜爽天天爽三区麻豆AV网站| 中文字幕免费看| 综合97亚洲| 欧美18禁91| 中文字幕老熟妇黄色视频| 搡老熟女老女人老熟妇免费视频| 激情抓乳插进去啪啪啪日韩 | 亚洲精品无码久久AV| 亚洲欧美综合| 久操免费在线| 天天日天天看| 人人妻人人澡人人爽久久av| 国产精品乱码久久久久久久久| 天堂涩涩| 97视频新免费| 天天干1区2区在线| 亚洲精品人伦一区二区| 日韩欧美中文字| 蜜桃视频一区二区三区 | av天堂精品久久| 密乳视频在线| 日韩av无码网站| 97干97色| 欧美激情一区| 婷婷干黄色| 国产亚洲深夜激情| 日逼逼免费看| 91天堂色男人的天堂| 美女一区二区国产精品| 亚洲AV无码久久久国产精品| 色色操| 一区二区三区精品黑丝白丝酒店对鸡 | 美女黄网| 91精品微拍福利| 午夜AV人气不卡| 操逼视频亚洲| 五月婷婷六月丁香| 91精品国产综合久久久蜜臀| 欧美色图中文字幕| 狠狠躁天天躁日日躁| 香蕉大久久久| 玖玖久久久| 狠狠婷婷亚洲中文综合久久| 91精品亚洲内射孕妇| 精品成人亚洲午夜电影| 久久国内| 国产欧美日韩女同性恋ww喷水精品 | 内射卯月麻衣| 欧美性高潮| 欧美精品成人一区二区在线观看| 亚洲综合另类小说色区亚洲成av人片在www | 操高情无码| 欧美精品自慰系列寂寞少妇| 欧美淫穴| 欧美亚州色的图| 噜噜噜噜久久久精品免费| 91亚洲综合| 激情无码日韩| 色婷五月天| 久久久性爱视频| 99视频自拍区| 国产操伦| 精品视频久久久久九九九九9999| 69视频福利导航| 亚洲精品97p| 久久精品熟女亚洲AV麻豆软件| 最好看的中文字幕在线2018| 亚洲欧洲另类| av东京热男人的天堂| 青青草公开在线免费不卡视频| 91性高朝久久久久久久久| 人人干人人搞人人摸| 四虎AV无码| 啊啊啊慢点| 一级做a爰片久久毛片图片| 久久综合九九| 97超碰总站| 边做饭边操逼逼| 天天爱天天操| 中精品一区二区三区| 精品人妻一区二区三区四区石在线| 户外裸露刺激视频第一区| 久久久久久大| 欧美 亚洲| 日本一级性爱| 国产日韩欧美| 天天干天天燥| 亚洲综合113页| 搡老女人老91二区| 五月丁香六月激情综合| 国产外初女出血视频| 天天激情综合站| 久久欧美1卡2卡3| 欧美综合1性辶| 亚洲欧洲国产综合av| 91在线/欧洲| 精品成人无码| 97干天天| 久久久久久久久久久免费精品| 美女露胸露屁股| 天堂男人网| 日本大片日本一区二区免费高清| 国产suv精品一区| 91 亚洲 欧美 日韩 国产 综合| 亚洲自拍欧美国产首页网曝| 五月天婷婷在线看| 丝袜性亚洲| 手机午夜电影神马久久| 96精品久久久久中文字幕| 高清在线偷拍自拍视频| 男人的天堂久久狠| 欧美性巨大╳╳╳╳╳高跟鞋| 高清孕妇孕交 交孕妇| 日韩午夜精品一区二区三区电影| 综合91网| 国产亚洲精品第一最新| 亚洲风情综合网| 日韩性爱播放| www欧美91| 亚州伊人色综台| 97精品免费视频网站| 麻豆精品久久久久久久| 成年无码动漫av片无尽在线 | 欧美激情激情xxxx欧美专区| 少妇国产不卡| 综合国产影视三级| 蜜臀一二三| 看一级黄色视频| 欧美激情专区| 91精品成人| 久久九九国产精品| 欧美性爱超碰97| 你操综合| 在线欧美69V免费观看视频| 中国黄色特级精品一区二区三区片| 99久久精品无码一区二区| 热热色青青草| 国产最新AV| 两女互慰AV高潮喷水在线观看| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 精品无码久久| 久操99| 可以在线观看的黄色网址| 九九超碰综合网| 韩日精品四区| 国产精品嫩草影院午夜两性| 亚拍在线| 大香蕉97久久| 久久精品中文字幕观看| 清纯唯美激情| 免费网站观看www在线观| 久久精品店| 一起草高清无码| 日本熟妇精品九九| 美中韩AV综合网| 神马久久久久久伦理片| 天天爽天天操啊啊啊| 无码视频一区二区| 五月丁香六月激情| 很黄很色的视频在线观看| 少妇无码999| 中文字幕人乱码中文字的预防方法 | 国产女主播视频在线观看| 又大又白奶子| 久久鲁干| 亚洲人妻在线一区| 看全色黄大色大片免费视频| 精品视频久久区| 啊啊啊啊啊操我视频| 国产吞精a级片激情电影| 亚洲国产一级黄色视频| 骚熟女AV网| ai欧美亚洲小说| 91黑丝少妇| 玖玖婷婷五月天| 欧美顶级黄色大片免费| 天天视频黄| 97在线免费视频观看| 国产欧美黑人丰满在线| 久久97资源 网| 久久超碰久| 狠狠色丁香| 亚洲av淫乱| 中文字幕一区二区在线日韩精品| 国产精品美女久久久久久网站| 一本久久久精品| 亚洲国产青青| 麻豆一区在线| 国产丝袜美腿美女麻豆| 超AV色女| 97视频网站在线观看| 久久婷婷伊人| 十八禁啪啦拍视频无遮挡| 日韩激情中文字幕有码| 久草免费福利在线播放| 亚州一区二区成人片免费| www.色吧5.com| 亚洲日韩av专区无码| 综合97| 96精品久久久久久久久久| 极品肉射| 丰满人妻-区二区三区免费看 | 夜夜狠狠躁日日躁色视频| 九九九久千久久激情蜜桃在线看| 欧美日韩m| 女人的久久久| 国产精品熟女AV中文字幕在线播放| 国产欧美第五页| 亚洲情色电影网| 97资源超碰| 人妻出轨一区二区三区| 天天综合网91入口| 丁香五月天久久精品视频一区二区三区| 国产白领连续中出在线观看| 少妇毛片久久| 狠狠夜色午夜久久综合在线| 最新精品久久蜜桃 | 亚州色图欧美色图| 久久久久久久| 精品午夜福利导航| 在线观看不卡一区二区三区| 天天草夜夜草高潮片| 亚洲黄色a级片| 精品成人av一区二区三区在线| 久久婷婷影院| 九九毛片这里只有精品| 91色综合激情| 国产成人精品一区| 2017天天插| 婷婷干黄色| 国产www色在线观看| 美女黄频a美女大全免费皮| 香蕉久久国产AV一区二区| 夜夜一区二区| 天天天天天天天天综合| 综合天天。| 九九九九九精品| 性videos欧美熟妇hdx| 日韩成人精品视频自拍| 五月丁香啪| 欧洲乱码视频| 日本三级精品| 91精品微拍福利| 乱色视频中文字幕| 中文久久一区| 人妻91少妇| 正在播放国产精品一区| 丁香九月激情| 性性欧美| 日本女人久久久| 国产 日韩 欧美高清| 综合激情五月丁香| 97爱b| 国产精品扒开腿做爽爽爽视频| 人人做天天爱| 久久久一区二区三区四曲免费听| 91天天c| 久久久久久久9| 秋霞蝌科网日本一区| 97日本超碰综合| 亚洲怡春院| 国产成久久综合片| 九九碰九九爱97| 操死我了嗯嗯嗯| 亚洲人成在线放东京热| 操逼网免费无码视频| 欧美爆操91| 超碰人妻久久| 欧美日韩中文亚洲v在线综合| 中文字幕亚洲欧美在线不卡| 久久岛国| 99日韩| 欧美第二页午夜| 亚洲性爱电影| 草b在线| 无码人妻一区二区三区四区老鸭窝| 91深夜夜| 二对二中文字幕。| 日本精品五区| 色欧美天天| 久操电影网| 日韩激情中文字幕有码| 先锋音影AV| 国产亚洲精品久久久久小| 国产欧美一区二区| 伊人加勒比| 精品精品精品| 欧美精品一二三| 狠狠色综合网| 亚洲狠狠入| 丰满的三级少妇欧美久久久| 国产精品久久久久久夜夜夜夜| www亚洲免费| 天天做天天爱天天爽AV| 日韩电影在线观看网址| 97WW精品| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 亚洲情色 自拍| 伊人女女资源在线观看| 亚洲诱惑天堂| 天天色综亚洲91污| 成人夜夜| 久久99综合| 日本在线伊人啪啪| 五月天伊人| 久草免费在线视频| 欧美|91色综合| 欧美99999| 嗯……啊…嗯嗯…啊…好舒服| 99精品国产户外露出| 天色综合网| 日本精品网站在线中文| 成人久久精品| 99热在线观看| 欧美激情区| 97精品一二区| 国产v片在线免费观看| 日韩精品人妻中文字幕久久久| 操逼逼一区视频| 日韩精品大香蕉伊人在线| 亚洲成熟国产精品美女| a啊啊啊啊啊啊啊啊一区二区| 超碰综合97在线| 再深点灬舒服灬太大了好硬好爽| 综合亚洲网| 九九精品美女高溯喷水| 69少妇一区二区| 超碰在线综合97| 七久久久| 吖在线不卡一区二区国产剧情| 天天草AV| 亚洲 欧美都市激情| 欧美大香蕉久| 91精品国产长腿丝袜美女| 欧美有码激情视频一区二区三区| 色吧5亚洲| 亚州国产成人精品女人久久| 欧美激情五月天| 91P0RNY大屁股人妻| 亚洲一区制服诱惑| 奸色色 男人天堂 天天射| 中文字幕乱码人妻二区三区| 夫妻AV网站| 九九九九九九亚洲| 中文字幕亚韩| 国产二区三区免费视频| 亚州国产成人精品女人久久| 日本有码久久| 综合欧美激情网| 综合色一区三区二区| 大香蕉啪啪啪啪在线| 九九热精品| 少妇啪啪自拍| 婷婷综合伊人一区| 精品一区二区久久| 特级大荫道BBwBBwBBW| 国产精品久久成人免费| 婷婷超| 久久婷婷一区| 久久人爽| 国产久久视频| 99热婷婷| 国产精品久久久久久久毛片1| 久久大黄片| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | www.99在线| 久久五月天婷婷丁香中文字幕| 国产视频第二页| 蜜臀av网址| 欧美 综合| 天天日少妇逼AV| 久久久免费一级黄片| 伊人网青青| 精品九九九| 人妻丝袜一区二区三区在线| 精吧天堂| 人妻少妇色综合| 欧美熟妇精品黑人巨大一二三区| 婷婷五月天网| 激情五月天丁香社区| 欧美日韩国产三级黄色| 三级日韩一区二区三区| 另类天堂| 神马久久午夜| 亚洲图片91| 亚洲欧美激情小说| 破处bbq| 九九九九免费视频| 青青草男人天堂| 精品97久久综合| 四季AV综合网址| 麻豆 欧美 日韩| 男人亚洲91首页在线| 色婷婷电影网| 1024日韩| 五月天激情国产综合婷婷婷| 超碰人人干| 亚洲国产一区二区三区四区国产| 国语精品内射在线观看| 久草免费福利在线播放| 国产精品久久久久久无码红治院| 国产特级毛片AAAAAA高潮流水| 毛片久久| 91久久免费视频互動交流 | 国产精品电| 国产成人久久精品蜜臀| 欧美情色贴图| #NAME?| 久操影视| 国产夫妻性生活视频| 欧美综合色综合| 亚州欧美在线| 久久人妻熟女一区二区| 欧美精品97| 欧洲在线性爱视频| 翔田千里爆乳巨臀无码| 中文字幕日韩人妻视频| 丰满人妻无码一区二区三区| 国产成人手机视频激情| 亚洲蜜桃V妇女| 综合婷婷| 一二三啪啪专区| 久久爽爽精品| 国产超碰97| 免费视频一二三区| 亚洲中文字幕精品一区| 97在线精品观看视频| 亚洲成熟国产精品美女| 日本福利社| 青青草视频久久久久| 91AV天美在线视频| 国产又粗又长视频| 亚洲av噜噜噜噜噜噜| 日韩亚洲精品一区二区| 操99| 色婷婷蜜臀av| 亚洲欧美91√| 91人人| 高清成年美女黄网站免费大全| 不卡啪啪视频| 少妇诱惑视频| 天天天堂影视日韩亚洲91| 国产免费内射视频| 成人av在线播放| 97香蕉碰碰人妻国产欧美| 午夜精品99久久久久传媒| 男人天堂综合| 精品对白久久不卡| 高清无码一区二区三区| 六月丁香啪啪| 91成人社区| 亚州综合色| 91爆操视频| www.97在线| 久久熟女嫩草成人片免费| 亚洲高清视频在线免费观看| 激情综合网五月婷婷五月天| 色爽爽文学| 爱丝福利| 人人妻人人爽 97人人看碰人免费公开视频| 欧美麻豆成人同性GⅤ在线| 中文字幕国产精品1区| 天天干1区2区在线| 成年人网站在线免费观看| 大香蕉丝袜一级片| 秋霞午夜视频一区二区| 亚洲91色| 97啪啪| 大香蕉92| 欧美自拍偷拍综合图片| 口爆综合网| 99日视频在线免费| 人妻在线臀日韩| 亚洲欧美综合图片| 免费伦费视频在线观看| 一区二区三区四区姦女| 99re超碰| 久久99网站| 亚洲色图第四色| 国产亚洲日韩在线三区黑人| 亚洲综合码| 九九九免费视频| 91狠狠综合久久| 国产精品夜夜夜| 免费A V在线播放| 曰本91情色| 亚洲性爱电影| 97久久精品亚洲中六字幕| 超碰在线一区二区| 一区二区 韩日AV| 天堂亚洲精品| 一区在线观看中文字幕| 色亚州人久干视频在线观看免费版| 黄片qw| 青久操| 国产9 9在线 | 亚洲| 日韩影片中文字幕一区二区三区| 中文字幕一区二区三区50路| 亚洲综合五月天| 男人的天堂久久| 亚洲午夜AV| 午夜美女诱惑电源网| 日本免费亚洲欧美| 亚洲AV永久无码精品成人调教| 国产小u女在线观看| 国产中午字一暮区| 中文字幕 国产区| 午夜亚洲| 蜜臀av一区二区三区免费观看| 97免费视频在线| 性色一线| 91丨国产丨白浆秘 洗澡动漫| 日本九九久久99播| 国产精品久久妻无码网站 | 1769一区| 久久久久久久久久久久黄色| 大学生口爆吞精| 公司1区2区3区精产精| 立川理惠无码一区二区| 精品人妻一区二区三区四区| 人妻丝袜无 码视频专区| 久久九色| 久久久av爱| 婷婷视频在线免费观看| 四虎影视国产精品| 91在线欧色| 91影库| 久久久久幕乱码| 亚洲人妻一区二区三区| 美女裸体无遮挡永久免费观看网站| 99999精品成人| 国产AV毛片| 麻豆天美在线| 久久久久久性爱视频| 亚洲国产精品无码AV在线| 久久大香蕉97| 日本美女性生活久久久久久久| gogogo免费高清看中国国语| 九9精品| 国产av高清版| av最新免费中文字幕| 色欧美色交综合| 尤物av网站| 人妻中文字幕日韩电影| 久久久久99999| 欧美 亚洲 另类 综合| 九九综合久久| 无码精品久久| 麻豆一区二区AV天美| 成人综合网 欧美| 丰满的三级少妇欧美久久久| 国内毛片欧美香蕉精品| 欧美综合狠| 欧美性色综合网| 色婷五月| 午夜.DJ高清在线观看免费7 | 少妇蜜汁| 国产女人91精品嗷嗷嗷嗷| 人妻一区二区三区四区视频| 亚洲色图自拍| 嗯嗯嗯嗯啊啊啊好紧好大| 亚洲成人福利电影免费| 狠狠91| 精品丰满熟妇人妻一区| 99国产精品免费| 欧美视频在线第3页| 伊人激情五月天一区二区| 欧美性第一页| 麻豆一区二区三区在线看 | 天天插夜夜操| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 殴美,日韩国产伦精品| 欧美强奸一区二区诱惑| se吧提供91精品国产91久久久久久| 青青草综合在线| 日本中文字幕一区| 91精品人妻一区二区三区蜜桃臀| 99综合免费视频| 强奸乱伦日韩AV| 777琪琪午夜免费A片| 无码人妻1727| 少妇精品| 骚妻少妇精品性色无码四色A V| 伊人久久大香线综合无码| 加勒比在线视频| 五月天色五月| 亚洲一区中文字幕一区| 亚洲啪啪视频一区二区| 亚洲无线码欧洲精品区别| 日本在线观看网址| 九九碰九九爱97超| 变态综合色| 丝袜美腿丝袜| 婷婷探花久久精品一区| 激情人妻另类| 欧洲精品网| 小明看看网址| 中文字幕天天操| 97青娱乐超碰久久| 综合网亚| 超碰人妻久久人妻中文97| 国产日本熟女顶级一区二区三区视频| 99激情视频| 五月婷婷丁香| 成人 日韩欧美一区| 五月天伊人| 国产精品交换一区二区| 蜜臀少妇一区二区| 亚洲国男人的天堂| 吻戏激情性巴克| 91亚州日韩高清| 九九天堂| 亚洲丝袜色图| 吉川爱美亚洲二区在线| 欧美成人综合| 免费97视频| yazhouzaixian| 丝袜美腿91| 亚州综合在线| 午夜小电影在线插入淫高潮| 日韩免费在线观看不卡| AA级电影三区| 日韩卡一卡二卡三在线| 91在线精品| 婷婷五月天AV| 北条麻妃99精品青青久久| 久久精品72|