2010-08-17 141 views
12

我想知道是否可以轻松关闭TreeView的ScrollViewer。WPF从TreeView中移除ScrollViewer

我有一个网格用户控件。其中一个单元在Stackpanel中有几个TreeView。 Control大小的高度自动取决于TreeView的高度,因此不需要滚动条。

问题是:我在ListBox中有一堆它们自己的ScrollViewer,但是当我使用MouseWheel时,当您在TreeView上时,滚动停止。

这是因为TreeView拥有自己的ScrollViewer,可以窃取MouseWheel。我知道这可能是通过覆盖控制模板,但我希望有一个更简单的方法。

回答

30

您可以使用此处所述的技术:http://serialseb.blogspot.com/2007/09/wpf-tips-6-preventing-scrollviewer-from.html来防止ScrollViewer处理鼠标滚轮事件。添加PreviewMouseWheel="HandlePreviewMouseWheel"到您的TreeView和定义HandlePreviewMouseWheel为:

private void HandlePreviewMouseWheel(object sender, MouseWheelEventArgs e) 
{ 
    if (!e.Handled) 
    { 
     e.Handled = true; 
     var eventArg = new MouseWheelEventArgs(
      e.MouseDevice, e.Timestamp, e.Delta); 
     eventArg.RoutedEvent = UIElement.MouseWheelEvent; 
     eventArg.Source = sender; 
     var parent = ((Control)sender).Parent as UIElement; 
     parent.RaiseEvent(eventArg); 
    } 
} 

更改控制模板不包括的ScrollViewer并不难,不过,由于TreeView控件的默认模板是相当简单的,最复杂的是处理ScrollViewer。尝试这样做:

<TreeView.Template> 
    <ControlTemplate TargetType="TreeView"> 
     <Border BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       SnapsToDevicePixels="true"> 
      <ItemsPresenter/> 
     </Border> 
    </ControlTemplate> 
</TreeView.Template> 
+0

嗯,似乎我的最后评论没有工作。无论如何,谢谢!我尝试了两个。 xaml控件模板运行良好,但PreviewMouseWheel在滚动时仍然“卡住”了几次。我将使用xaml解决方案。 – user380527 2010-08-17 03:47:11

+6

对于XAML解决方案+1(也适用于同样的问题) – JanW 2010-09-13 09:19:16