【问题标题】:Actual position of collapsed TreeViewItem on Canvas折叠 TreeViewItem 在 Canvas 上的实际位置
【发布时间】:2019-06-05 06:42:33
【问题描述】:

如果 TreeViewItem 的 Parent TreeViewItem 被折叠(意思是<ParentTreeViewItem>.IsExpanded = false;),有没有办法在 Canvas 上评估 TreeViewItem 的实际位置?调试时,父项 ItemsHost 中折叠项的可见性和位置信息似乎都没有更新。

感谢任何提示!

干杯,亚历克斯

【问题讨论】:

  • 你想做什么?您是否尝试强制测量/安排通过以获得位置/尺寸?虽然我不确定可见性是否重要,或者您希望折叠的项目得到什么结果。如果您证明:“在父项的 ItemsHost 中折叠项目的可见性和位置信息似乎都没有更新” 并带有一些代码/xaml/屏幕截图,那将是最好的。.
  • 嗨,实际上我在画布上有两个 TreeViews,并通过一条线(连接)连接它们的 TreeViewItems。如果将 TreeViews 拉到画布上,这可以正常工作,并且连接端会改变它们的位置。但是,如果连接的 TreeViewItem 的父 TreeViewItem 折叠,我希望连接端向上移动到折叠的父级高度。但相反,连接端保持在之前展开的位置——当我调试时,我发现子项的位置和可见性信息在其父项折叠时没有更新。

标签: c# wpf visibility treeviewitem


【解决方案1】:

找到解决此问题的方法:

基本上,每当 TreeViewItem 触发 OnCollapsedOnExpanded 事件时,我都会强制所有其他 TreeViewItem 根据其祖先的 IsExpanded 属性确定它们自己的位置,直到树根。

如果任何祖先被折叠(即IsExpanded == false),我会将其位置应用于当前的 TreeViewItems 位置。

如果没有任何祖先被折叠,我会应用它自己的位置(而位置是 TreeViewItem 的自定义 Point 属性)。

代码示例:

private Point DeterminePosition()
    {
        Point point = this.position;

        if (ParentTreeViewItem != null)
        {
            MyTreeViewItem parent = null, lastCollapsed = null;

            parent = ParentTreeViewItem;

            while (parent != null)
            {
                if (parent.IsExpanded == false)
                {
                    lastCollapsed = parent;
                }

                parent = parent.ParentTreeViewItem;
            }


            if (lastCollapsed != null)
            {
                point = new Point(position.X, lastCollapsed.Position.Y);
            }

        }

        return point;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-08
    • 2017-02-06
    • 2016-02-05
    • 2013-10-03
    • 1970-01-01
    • 2012-03-11
    • 2012-11-22
    • 2014-01-22
    相关资源
    最近更新 更多