wpf - 将 ItemsControl 与可拖动项目组合 - Element.parent 始终为 null

标签 wpf canvas draggable parent itemscontrol

我将带有 Canvas 的 ItemsControl 作为 ItemsPanelTemplate 绑定(bind)到 ObservableCollection。

我想使用 DraggableExtender 使项目可拖动,如中发布的 Dragging an image in 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)的父元素为空,因此拖动不起作用。

所以显而易见的问题是 - 我做错了什么?

最佳答案

由于项目并不直接位于 Canvas 内,因此您需要沿着视觉树向上移动,直到找到 Canvas 。我通常使用以下扩展方法来做到这一点:

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>();

关于wpf - 将 ItemsControl 与可拖动项目组合 - Element.parent 始终为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902392/

相关文章:

wpf - 半透明自定义布局面板

WPF:ContentPresenter 根据样式所在位置意外更改前景

javascript - Fabric.js 对象大小

javascript - 让用户使用 Javascript 在 canvas 中用鼠标绘制矩形

javascript - KineticJS Canvas - 从中​​心点缩放组

jQuery 可拖动 + 可排序 : strange mouse offset behaviour

c# - WPF XAML 绑定(bind)列表和组合框

c# - 混合 WPF 和 winforms 项目 DPI 意识

css - 当 div 可滚动时,div 中的可拖动元素显示在拖放区后面,需要它们显示在前面

javascript - 为什么这种 CSS 样式会干扰 HTML5 拖放? (位置: absolute; left: -10000px)