tl; dr:我想重用预定义WPF面板的现有布局逻辑来实现自定义WPF面板类.这个问题包含四种不同的尝试来解决这个问题,每个尝试都有不同的缺点,因而有不同的失败点.此外,可以进一步找到一个小测试用例.
问题是:我如何正确实现这一目标
我正在尝试编写自定义WPF 面板.对于这个面板类,我想坚持推荐的开发实践并维护一个干净的API和内部实现.具体地说,这意味着:
至于目前,我将密切关注现有的布局,我想重新使用另一个面板的布局代码(而不是再次编写布局代码,如此处所示).为了举个例子,我将基于解释DockPanel,虽然我想知道如何做到这一点,基于任何一种Panel.
为了重用布局逻辑,我打算DockPanel在我的面板中添加一个可视子项,然后保存并布局我的面板的逻辑子项.
我已经尝试了三种不同的想法来解决这个问题,并且在评论中提出了另一个想法,但到目前为止,每个想法都在不同的点上失败了:
1)在自定义面板的控件模板中引入内部布局面板
这似乎是最优雅的解决方案 - 这样,自定义面板的控制面板可以使用ItemsControl其ItemsPanel属性使用a DockPanel,其ItemsSource属性绑定到自定义面板的Children属性.
不幸的是,Panel不继承Control,因此没有Template属性,也没有对控件模板的功能支持.
另一方面,Children属性是由引入的Panel,因此不存在Control,我觉得打破预期的继承层次结构并创建一个实际上是a Control但不是a 的面板可能会被认为是hacky Panel.
2)提供我的面板的子列表,该列表仅仅是内部面板的子列表的包装器
这样的课程如下所示.我已经子类UIElementCollection在我的面板类,并从一个重写版本返回它CreateUIElementCollection的方法.(我只复制了这里实际调用的方法;我已经实现了其他方法来抛出一个NotImplementedException,所以我确信没有调用其他可覆盖的成员.)
using System;
using System.Windows;
using System.Windows.Controls; …Run Code Online (Sandbox Code Playgroud)