标签: layoutpanels

如何为新的Panel类重用现有的Layouting代码?

tl; dr:我想重用预定义WPF面板的现有布局逻辑来实现自定义WPF面板类.这个问题包含四种不同的尝试来解决这个问题,每个尝试都有不同的缺点,因而有不同的失败点.此外,可以进一步找到一个小测试用例.

问题是:我如何正确实现这一目标

  • 定义我的自定义面板
  • 内部重用另一个面板的布局逻辑,没有
  • 遇到我试图解决这个问题所描述的问题?

我正在尝试编写自定义WPF 面板.对于这个面板类,我想坚持推荐的开发实践并维护一个干净的API和内部实现.具体地说,这意味着:

  • 我想避免复制和粘贴代码; 如果代码的几个部分具有相同的功能,则代码应该只存在一次并重复使用.
  • 我想应用适当的封装,让外部用户只能访问可以安全使用的成员(不破坏任何内部逻辑,或者不泄露任何内部实现特定的信息).

至于目前,我将密切关注现有的布局,我想重新使用另一个面板的布局代码(而不是再次编写布局代码,如此处所示).为了举个例子,我将基于解释DockPanel,虽然我想知道如何做到这一点,基于任何一种Panel.

为了重用布局逻辑,我打算DockPanel在我的面板中添加一个可视子项,然后保存并布局我的面板的逻辑子项.

我已经尝试了三种不同的想法来解决这个问题,并且在评论中提出了另一个想法,但到目前为止,每个想法都在不同的点上失败了:


1)在自定义面板的控件模板中引入内部布局面板

这似乎是最优雅的解决方案 - 这样,自定义面板的控制面板可以使用ItemsControlItemsPanel属性使用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)

.net c# wpf panel layoutpanels

12
推荐指数
1
解决办法
753
查看次数

标签 统计

.net ×1

c# ×1

layoutpanels ×1

panel ×1

wpf ×1