gpt4 book ai didi

c# - 在滚动条上的 WPF TreeView 中拖放

转载 作者:太空狗 更新时间:2023-10-29 19:43:01 26 4
gpt4 key购买 nike

我们在我们的应用程序和窗口中使用 MVVM 模式,我们有两个 TreeView 允许从第一个树中拖动项目并将其放到第二个树上。为避免代码隐藏,我们使用行为将拖放绑定(bind)到 ViewModel。

该行为已基本实现 like this example并且像一个魅力一样工作,有一个错误。

场景是一棵比显示它的窗口大的树,因此它有一个垂直滚动条。当一个项目被选中并且用户想要滚动时,程序开始拖放(这会阻止实际的滚动,因此不是我们想要的)。

这并不奇怪,因为滚动条包含在 TreeView 控件中。但是我无法安全地确定鼠标是否在滚动条上。

TreeViewItems 由使用边框、面板等的主题表示,因​​此简单的 InputHitTest 并不像人们想象的那么简单。

有没有人遇到过同样的问题?

如果需要更多代码覆盖问题,我可以粘贴 .xaml 中的一些行。


编辑

结合 Nikolays 链接,我使用 IsMouseOverScrollbar 方法解决了这个问题,如果以后有人遇到这个问题,必须按以下方式更改上面的代码:

private static void PreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed || startPoint == null)
return;

if (!HasMouseMovedFarEnough(e))
return;

if (IsMouseOverScrollbar(sender, e.GetPosition(sender as IInputElement)))
{
startPoint = null;
return;
}

var dependencyObject = (FrameworkElement)sender;
var dataContext = dependencyObject.GetValue(FrameworkElement.DataContextProperty);
var dragSource = GetDragSource(dependencyObject);

if (dragSource.GetDragEffects(dataContext) == DragDropEffects.None)
return;

DragDrop.DoDragDrop(
dependencyObject, dragSource.GetData(dataContext), dragSource.GetDragEffects(dataContext));
}


private static bool IsMouseOverScrollbar(object sender, Point mousePosition)
{
if (sender is Visual)
{
HitTestResult hit = VisualTreeHelper.HitTest(sender as Visual, mousePosition);

if (hit == null) return false;

DependencyObject dObj = hit.VisualHit;
while(dObj != null)
{
if (dObj is ScrollBar) return true;

if ((dObj is Visual) || (dObj is Visual3D)) dObj = VisualTreeHelper.GetParent(dObj);
else dObj = LogicalTreeHelper.GetParent(dObj);
}
}

return false;
}

最佳答案

看看this implementation of Drag and Drop behaviour for ListView by Josh Smith .它有代码来处理滚动条和其他一些不明显的 DnD 问题(比如拖动阈值、精确的鼠标坐标等)。这种行为也可以很容易地用于 TreeViews。

关于c# - 在滚动条上的 WPF TreeView 中拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10171107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com