問題起因:在一個用戶控件里放置了1個TreeView垂直順序放置。 當用戶控件中的內容超過面板大小時,滾動條會自動出現 ,但是只有當鼠標指示在右邊滾動條的那一條位置時,才支持鼠標滾軸滾動。 點在控件內部時滾軸無效。
問題分析:由於設置了d:designheight,自定義控件的寬高都是隨着父容器的變化而變化的,於是我將Height設為較小的固定高度時,發現鼠標停留在控件內容時,滾輪控制滾動條滾動是有效的。這就說明UI上顯示的滾動條並非是這個自定義控件的,而是這個自定義控件所在的父容器的,這樣也解釋了為什么之前在內容上滾動無效,但是在滾動條上是可以滾動的原因,然后接下來就好辦了。代碼如下:
//在構造函數中綁定treeview的鼠標滾輪事件,原因是在xmal前台綁定時觸發不了MouseWheel事件 public TreeViewList() { InitializeComponent(); treeview.AddHandler(TreeView.MouseWheelEvent, new MouseWheelEventHandler(treeview_MouseWheel), true); } //根據父控件對象查找指定類型的子控件 private T GetVisualChild<T>(DependencyObject parent) where T : Visual { T child = default(T); int numVisuals = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numVisuals; i++) { Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); child = v as T; if (child == null) { child = GetVisualChild<T>(v); } if (child != null) { break; } } return child; } private void treeview_MouseWheel(object sender, MouseWheelEventArgs e) { //在treeview的基礎上,層層查找,直到找到它的父容器,是個NavToolbar(滾動條是NavToolbar的滾動條,並非treeview的) try { var scroll = GetVisualChild<ScrollViewer>( ((((((((treeview.Parent as Grid).Parent as ChapterList).Parent as Grid).Parent as ScrollViewer). Parent as Border).Parent as Grid).Parent as Grid).Parent as Border).Parent); if (scroll != null) { scroll.ScrollToVerticalOffset(scroll.VerticalOffset - e.Delta); } } catch (Exception) { } }