Мне было интересно, можно ли легко отключить ScrollViewer в TreeView.
У меня есть UserControl с сеткой. У одной из ячеек есть несколько TreeViews внутри Stackpanel. Высота размеров элемента управления автоматически зависит от высоты TreeView, поэтому полоса прокрутки не требуется.
Проблема в том, что у меня есть куча таких в ListBox с собственным ScrollViewer, но когда я использую MouseWheel, прокрутка останавливается, когда вы находитесь над TreeView.
Это потому, что TreeView имеет свой собственный ScrollViewer, который крадет MouseWheel. Я знаю, что это возможно, переопределив шаблон управления, но я надеюсь, что есть более простой способ.
Вы можете использовать технику, описанную здесь: 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>