c# - WPF 从 TreeView 中移除 ScrollViewer

标签 c# wpf treeview scrollviewer

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

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

问题是:我在带有自己的 ScrollViewer 的 ListBox 中有一堆这样的东西,但是当我使用 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>

关于c# - WPF 从 TreeView 中移除 ScrollViewer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3498686/

相关文章:

c# - .Net Windows 服务崩溃并出现 MSVCR120_CLR0400.dll 异常

wpf - 单击登录按钮时,我想隐藏当前窗口

wpf - 如何解决 Blend 4 中嵌入式用户控件中的设计时静态资源

javascript - 将分组查询转换为对象树

c# - 在 GitHub 拉取请求上显示 C# 代码覆盖率?

C#接口(interface)继承

c# - ComboBox SelectedText,为什么不切换到SelectedText项?

c# - DataTrigger 不会更改 Text 属性

python - 默认或以编程方式对 TreeView 中的列进行排序

php - 如何在PHP中实现jQuery异步树形 View ?