Wpf 我需要关于如何设计/实现这个定制面板的建议

Wpf 我需要关于如何设计/实现这个定制面板的建议,wpf,xaml,panel,itemscontrol,Wpf,Xaml,Panel,Itemscontrol,我编写了一个自定义面板,其中显示了垂直或水平停靠的子面板,子面板之间通过移动拆分器隔开。由于Grid面板提供了很多现成的功能,所以我只是继承了它 要创建布局,在启动加载后,我将执行以下操作: 1) Read how many children it has and create the appropiate number of rows/colums. 2) Position every existing children in the corresponding row/colum. 3) C

我编写了一个自定义面板,其中显示了垂直或水平停靠的子面板,子面板之间通过移动拆分器隔开。由于Grid面板提供了很多现成的功能,所以我只是继承了它

要创建布局,在启动加载后,我将执行以下操作:

1) Read how many children it has and create the appropiate number of rows/colums.
2) Position every existing children in the corresponding row/colum.
3) Create, position and add a GridSplitter for every child.
这种方法看起来很好,工作也很好,但它为许多问题打开了大门:

  • 因为它为每个子项添加了一个GridSplitter,所以子项的数量是预期的两倍。如果有人向其中添加3个元素,Children.Count将返回6

  • 用户可能在错误的位置插入/删除内容

  • 当此网格用作ItemsControl的ItemsPanel时,它只会引发一个异常,因为在这种情况下WPF(不是Silverlight)不允许直接子级操作

这3个案例是我已经测试过的,但我非常确定,根据用户对它的操作,还会出现更多的情况

事实证明,这个类必须被视为“实现细节”,所以真正的问题是,我应该在用户面前放置什么控件

听起来它应该是一个面板,但我不能控制Children属性,因为它不是虚拟的,还有ItemsControl,我认为它可能是一个很好的候选者,但我真的不知道

我非常感谢任何建议或指导,以正确的方式做到这一点


提前感谢。

您可以看到,使用just grid,您只需使用一种必要的方式来添加项目。如 myCustomGrid1.AddMyItem(***),网格没有ItemsSource属性。ItemsControl会这样做-如果您需要对声明性项源的支持,例如myControl.ItemsSource={Binding…},那么您将从ItemsControl派生控件。这不是一个两行程序——让你的ItemsPanel孩子们可写是一个巨大的挑战——没有简单的方法可以做到这一点

这是网格设计过程中忽略的一件小事——拆分器不应该添加到子集合中,因为子集合是BOs的可视化,而spliiter只是格式化元素

这是我要做的

  • 完全忘记物品来源和物品-这并不麻烦。向控件添加/删除项的唯一方法是AddResiazableItem/RemoveResizbleItem。调用将添加项目和拆分器(对于中间的项目),根据网格的方向扩展网格的行数/列数,为可视化子项设置grid.Row/grid.Column附加属性。可以在内部保留实际对象以支持方向更改

  • 如果在任何阶段希望将控件绑定到IEnumerable源代码,只需创建一个附加的行为,该行为将遍历项并在循环中调用AddResiazableItem

  • 干杯

    各位版主,编辑好像崩溃了,伙计们。我看不到第二项。
    P.S.S.试了几次后就修好了。

    嗨,我同意ItemsControl。您正在将项添加到控件中,因此它必须是ItemsControl。在添加项目方面-您想同时使用declrative和祈使方式还是只使用一种?@Dmitry:如果可能的话,我想同时支持这两种方式。有一种根本的方法可以解决这个问题-使用装饰器而不是拆分器:)声明性调用将发出类似控件的调用。Children.为您的项目面板(网格)添加(…)这会破坏你的网格结构。我建议坚持使用装饰物(这将解决您对视觉效果数量的担忧,并使整个设计更加干净)。请告诉我它是否对您有用。@Dmitry:我选择从网格继承,因为它对拆分器的“本机”支持,所以如果我不这样做,我想我必须编写所有这些部分?@Dmitry:另外,如果我能去掉拆分器,我想我会将其作为一个面板来实现。+1似乎我不得不放弃网格实现。。。这太容易了:p