【问题标题】:Canvas in WPF - How do I detect when an element has been added/removed from the canvas?WPF 中的画布 - 如何检测何时从画布中添加/删除元素?
【发布时间】:2016-06-24 19:24:25
【问题描述】:

我从标准 WPF 画布创建了自己的子类以支持各种附加功能,其中我想管理画布上元素的 Z-Index,但为了做到这一点,我需要在任何时候运行一些代码元素被添加到画布或从画布中删除。不幸的是,画布和它的 Children 属性似乎都没有适当的事件来处理这些情况。

解决此问题的最佳/最简单方法是什么?现在我从外部手动调用一个方法,从我的代码中的任何地方添加/删除一些东西,但这非常“hacky”并且对于将来的代码重用不是很好。

【问题讨论】:

    标签: .net wpf canvas


    【解决方案1】:

    在 MSDN 上查看this post,我认为它回答了您的问题。

    至于你的问题,我想你可以尝试在添加孩子的时候重写 OnVisualChildrenChanged() ,它可以解决你的问题,更多细节你可以参考:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/d8933264-0958-499f-b6cd-41d61713ac8e

    【讨论】:

      【解决方案2】:

      我认为最好的方法是覆盖 Canvas 类的ArrangeOverride,因为您实际上是在改变孩子的排列方式。

      您可以保留上一个子集合的历史记录并将其与当前集合进行比较。

      EDIT mzabsky 是对的,你应该先尝试使用 OnVisualChildrenChanged。

      【讨论】:

        【解决方案3】:

        我无法添加评论。所以,我想在之前的评论中添加信息。 当然,在我的示例中,我不能使用 OnVisualChildrenChanged 或 ArrangeOverride。

        我有以前的孩子的缓存列表:

        private readonly List<UIElement> _elements = new List<UIElement>();
        

        我订阅事件,当任何属性发生变化时调用 - LayoutUpdated。 在事件处理程序中:

                if (_canvas == null) return;
                var children = _canvas.Children.OfType<UIElement>().ToList();
                if (_elements.SequenceEqual(children)) return;
                var removeElements = _elements.Except(children);
                var newelements = children.Except(_elements);
                _elements.AddRange(newelements);
        

        【讨论】:

          猜你喜欢
          • 2014-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-13
          • 2021-05-25
          • 1970-01-01
          • 2018-08-20
          相关资源
          最近更新 更多