WPF Удалить ScrollViewer из TreeView - PullRequest
14 голосов
/ 17 августа 2010

Мне было интересно, можно ли легко отключить ScrollViewer в TreeView.

У меня есть UserControl с сеткой. У одной из ячеек есть несколько TreeViews внутри Stackpanel. Высота размеров элемента управления автоматически зависит от высоты TreeView, поэтому полоса прокрутки не требуется.

Проблема в том, что у меня есть несколько таких в ListBox с собственным ScrollViewer, но когда я использую MouseWheel, прокрутка останавливается, когда вы находитесь над TreeView.

Это потому, что TreeView имеет свой собственный ScrollViewer, который крадет MouseWheel. Я знаю, что это возможно, переопределив шаблон управления, но я надеюсь, что есть более простой способ.

1 Ответ

35 голосов
/ 17 августа 2010

Вы можете использовать метод, описанный здесь: 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>
...