我想知道是否可以轻松关闭 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/