我从标准的WPF画布创建了自己的子类,以支持各种附加功能,其中我想管理画布上元素的Z-Index,但为了做到这一点,我需要运行一些代码。在画布中添加或删除元素。不幸的是,不是画布也不是儿童属性似乎有适当的事件来处理这些情况。
解决此问题的最佳/最简单方法是什么?现在我从外面手动调用一个方法,从我的代码中我添加/删除一些东西,但这非常“hacky”,并且对于将来重用代码不太好。
答案 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);