WPF Премахнете ScrollViewer от TreeView

Чудех се дали е възможно лесно да изключа ScrollViewer на TreeView.

Имам UserControl с Grid. Една от клетките има няколко TreeView в Stackpanel. Височината на контролите се оразмерява автоматично в зависимост от височината на TreeViews, така че няма нужда от лента за превъртане.

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

Това е така, защото TreeView има свой собствен ScrollViewer, който краде MouseWheel. Знам, че това вероятно е възможно чрез замяна на контролния шаблон, но се надявам, че има по-лесен начин.


person user380527    schedule 17.08.2010    source източник


Отговори (1)


Можете да използвате техниката, описана тук: 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>
person Quartermeister    schedule 17.08.2010
comment
Хм, изглежда последният ми коментар не проработи. Както и да е, благодаря! Пробвах и двете. Контролният шаблон xaml работи перфектно, но PreviewMouseWheel все още се забива няколко пъти при превъртане. Ще използвам xaml решението. - person user380527; 17.08.2010
comment
+1 за XAML решение (също работи перфектно със същия проблем) - person JanW; 13.09.2010
comment
перфектен Използвах този манипулатор заедно с EventManager.RegisterClassHandler, за да се отърва от необходимостта да се абонирам за всички контроли от същия тип, за да коригирам проблема. - person N. Kudryavtsev; 09.10.2019