wpf 中scrollviewer 中放置个LISTBOX,当焦点在LISTBOX时候,滚动鼠标不响应Scrollviewer的鼠标滚动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf 中scrollviewer 中放置个LISTBOX,当焦点在LISTBOX时候,滚动鼠标不响应Scrollviewer的鼠标滚动相关的知识,希望对你有一定的参考价值。

是不是要屏蔽掉LISTBOX等其他控件的鼠标滚动事件?求代码

参考技术A Private Sub List1_GotFocus(Index As Integer)
List1(Index).BackColor = &H80000005
End Sub

Private Sub List1_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = 37 Then
List1(0).SetFocus
ElseIf KeyCode = 39 Then
List1(1).SetFocus
End If
End Sub

Private Sub List1_LostFocus(Index As Integer)
List1(Index).BackColor = &H80000000
End Sub

WPF 从 TreeView 中删除 ScrollViewer

【中文标题】WPF 从 TreeView 中删除 ScrollViewer【英文标题】:WPF Remove ScrollViewer from TreeView 【发布时间】:2011-03-30 17:55:06 【问题描述】:

我想知道是否可以轻松关闭 TreeView 的 ScrollViewer。

我有一个带有网格的用户控件。其中一个 Cell 在 Stackpanel 中有几个 TreeView。控件的高度会根据 TreeView 的高度自动调整,因此不需要滚动条。

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

这是因为 TreeView 有自己的 ScrollViewer,它窃取了 MouseWheel。我知道这可能通过覆盖控件模板来实现,但我希望有更简单的方法。

【问题讨论】:

【参考方案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>

【讨论】:

嗯,看来我的最后一条评论不起作用。无论如何,谢谢!我都试过了。 xaml 控件模板运行良好,但 PreviewMouseWheel 在滚动时仍然“卡住”了几次。我将使用 xaml 解决方案。 +1 用于 XAML 解决方案(同样适用于同样的问题) 完美。我将这个处理程序与EventManager.RegisterClassHandler 一起使用,以摆脱订阅所有相同类型的控件来解决问题的需要。

以上是关于wpf 中scrollviewer 中放置个LISTBOX,当焦点在LISTBOX时候,滚动鼠标不响应Scrollviewer的鼠标滚动的主要内容,如果未能解决你的问题,请参考以下文章

安卓ScrollView中放ViewPager+ViewPager,ViewPager中放的是2个Fragment,Fragment中放Listview.

WPF 从 TreeView 中删除 ScrollViewer

在 WPF 的菜单中放置分隔线

WPF: 实现 ScrollViewer 滚动到指定控件处

WPF: 实现 ScrollViewer 滚动到指定控件处

在 SwiftUI 中放置在导航堆栈中时滚动视图的背景颜色