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

2023-11-27

我将带有 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(使用前将#替换为@)

将 ItemsControl 与可拖动项目组合 - Element.parent 始终为 null 的相关文章

  • MVVM ViewModel 很多属性

    我是 MVVM 新手 正在开发一个应用程序 我有一个包含很多属性的表单视图 大约 50 个 我不能将它们分离到用户控件中 因为这会破坏 mvvm 原则 我无法将它们分成模型 因为它们包含逻辑 属性更改 错误更改这些都不是 poco 类 并且
  • 如何从用户控件引发自定义路由事件?

    在我的用户控件中 我有一个按钮 单击该按钮时会引发自定义路由事件 我试图引发它 但它没有在 MainWindow xaml 中被触发 UserControl 中按钮的 Xaml
  • 如何更改每个 DataGrid 行详细信息的行详细信息的 DataTemplate 中的 TextBlock 的文本?

    我有 Datagrid 通过鼠标在每一行中单击显示数据网格行详细信息 这是代码 Microsoft Windows Controls DataGridRow row Microsoft Windows Controls DataGridRo
  • System.Windows.Threading.Dispatcher.Invoke(System.Delegate, System.Object[]) 何时添加?

    使用我的应用程序的一些人似乎越来越 System MissingMethodException Method not found System Object System Windows Threading Dispatcher Invok
  • 将固定文档/XPS 打印为 PDF,而不显示文件保存对话框

    我有一个FixedDocument我允许用户在 WPF GUI 中预览 然后打印到纸张上 而不显示任何 Windows 打印对话框 如下所示 private void Print PrintQueueCollection printQueu
  • ListView:在资源字典中定义ItemsPanelTemplate

    我有一个 ListView 其布局看起来像 Windows 资源管理器视图 图标 一些详细信息 绑定到 ViewModel 中某处的列表 我的目标是能够随时在资源管理器视图或经典视图之间切换 我可以定义一个ItemsPanelTemplat
  • WPF 3D - 在复杂几何体上映射渐变画笔

    我想问是否有人知道如何在 WPF 3D 中的复杂对象上映射渐变画笔 结果应该类似于 matlab 中的 3D 图像 例如 3D 函数 假设您有一些想要可视化的 3 维数据 并且想要通过颜色区分某些级别的值 给定一个 GradientBrus
  • 获取程序集中所有资源的列表

    我有一个文件夹Resources并想要获得一份包含所有内容的列表paths 如果我将它们设置为embedded resource 我可以通过 var resources Assembly GetExecutingAssembly GetMa
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • WPF Treeview,如何更改缩进

    我的树视图基本上有 文件夹 节点 以及不包含其他项目的项目下面的一层 因此 不需要用于展开 折叠图标的空间 在第 2 层 我可以放弃这个图标空间从而减少缩进吗 项目 在示例 机场 中 应向左移动一些像素 重要提示 基本上是寻找代码解决方案
  • WPF:鼠标按下时不会触发鼠标离开事件

    我遇到鼠标进入 离开事件的问题 当按下鼠标按钮并按住光标在控件内 然后光标以足够快的速度移出控件时 此事件不会触发 你能告诉我为什么会这样吗 有什么方法可以正确获取这些事件吗 请检查示例项目以查看其实际效果 https www dropbo
  • ResourceDictionary WPF 中样式的交互触发器

    我有一个ComboBox我需要在应用程序的多个地方使用它 所以我设置了它的大部分属性ComboBox in ResourceDictionary并在我需要的地方将其用作样式 风格为ComboBox is
  • 内容更新时自动调整列表视图列的大小

    我试图让列表视图中的 gridviewcolumns 在更新绑定源 视图模型上的可观察集合 时自动调整内容大小 列表视图填充正常 但当我刷新 更新集合时不起作用 这是我到目前为止正在尝试的解决方案 XAML
  • WPF 缩放变换和 ScrollViewer - 缩放时无法滚动超出原始大小

    我在 ScrollViewer 中有一个 StackPanel 我有一个滑块 可以在堆栈面板上进行缩放变换 以允许放大和缩小功能 问题是 当我放大时 滚动查看器不会将内容视为 更大 因此 如果我滚动一点并尽可能向右滚动 它会在我到达内容末尾
  • 在表格中可视化 2D 数据

    我需要一些帮助并且需要指出正确的方向 我正在创建一个应显示二维数据的 WPF 应用程序 它应该显示如下 y x 1 2 3 4 5 1 1 2 3 4 5 2 2 4 6 8 10 3 3 6 9 12 15 4 4 8 12 16 20
  • 如何使用 WPF 用户控件关闭父窗口

    假设我有两个 WPF 窗口 window One 和 window Two window One 有一个按钮 单击此按钮将打开 window Two window Two contains a User Control 该用户控件有一个用于
  • WPF 对 DataGrid 内的 TextBlock 进行全局样式设置

    我遇到了一个非常奇怪的问题 我正在尝试将全局样式应用于一个中的多个控件DataGrid 它们中的大多数完全按照我的预期工作 然而 对于TextBlock永远不会被应用 样式为ComboBox TextBox Label 和其他几个都被应用到
  • WPF 自定义控件 - ItemsControl 模板未应用

    我正在构建一个派生自 TabControl 的自定义 WPF 控件 在 ControlTemplate 中 我使用 ItemsControl 来显示从模板绑定的列表 FileMenuItem 类型的可观察集合 在程序执行期间 我在输出窗口中
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一

随机推荐