我将带有 Canvas 的 ItemsControl 作为 ItemsPanelTemplate 绑定到 ObservableCollection。
我想使用 DraggableExtender 使项目可拖动,如发布的在 WPF 中拖动图像(我不想使用变换 - 我需要使用 Canvas Left 和 Top 属性)
它的定义为:
<ItemsControl ItemsSource="{Binding Path=Nodes}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Views:NodeView DataContext="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Utilities:DraggableExtender.CanDrag" Value="True" />
<Setter Property="Canvas.Left" Value="{Binding Path=X}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
DraggableExtender需要元素的父元素是Canvas,
但我的元素(contentpresenter)的父元素为空,因此拖动不起作用。
所以显而易见的问题是——我做错了什么?
由于项目并不直接位于画布内,因此您需要沿着视觉树向上移动,直到找到画布。我通常使用以下扩展方法来做到这一点:
public static T FindAncestor<T>(this DependencyObject obj)
where T : DependencyObject
{
DependencyObject tmp = VisualTreeHelper.GetParent(obj);
while(tmp != null && !(tmp is T))
{
tmp = VisualTreeHelper.GetParent(tmp);
}
return tmp as T;
}
将上面的方法放在静态类中,并导入声明它的名称空间。在里面DraggableExtender
代码,只需替换这一行:
Canvas canvas = element.Parent as Canvas;
有了这个:
Canvas canvas = element.FindAncestor<Canvas>();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)