WPF中的画布 - 如何检测从画布添加/删除元素的时间?

时间:2011-02-27 15:36:35

标签: .net wpf canvas

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

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

3 个答案:

答案 0 :(得分:5)

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

  

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

答案 1 :(得分:0)

我认为最好的方法是覆盖Canvas类的ArrangeOverride,因为事实上你正在改变孩子们的安排。

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

编辑 mzabsky是对的,你应该首先尝试使用OnVisualChildrenChanged。

答案 2 :(得分:0)

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

我有以前孩子的cach列表:

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