如何根据标题高度定位WPF Expander?

时间:2010-02-11 14:45:34

标签: c# .net wpf

我一直在努力解决一个问题,乍一看现在看起来很容易。简而言之,我想根据扩展器中标头的高度来定位扩展器。

长篇大论是我有一个网格(当前,但可以很容易地改变)两行。在第一行的底部(标题的种类)我想放一个Expander。但是,我希望这个扩展器扩展到第二行。只需将扩展器放在第一行并将垂直对齐设置到底部就可以正确定位扩展器,但可以对扩展进行制动(仅扩展到同一行)。设置Grid.RowSpan =“2”使我的扩展器正确扩展但是将我原来的垂直对齐方式调到底部。我已经尝试将扩展器放在第二行,然后将扩展器的边缘绑定到扩展器的ActualHeight(以及一个转换器,它给了我一个等于高度的负上边距),结果很棒,直到我点击我的扩展器:-)。将绑定模式设置为“OneTime”由于某种原因给了我零余量。

有人有一个简单的解决方案吗?是否有助于基于画布为我的扩展器创建一个控件模板(我的想法是画布将在其他控件之上绘制)?我猜我可以对后代控件进行数据绑定(如果支持的话)(我认为不是这样)。我错过了任何明显的解决方案吗?

我有可能更改扩展器的控制模板,如果能帮助我,那么更改包含控件的窗口的网格布局不是问题。

我正在运行Visual Studio 2008,.NET 3.5。

//丹尼尔

1 个答案:

答案 0 :(得分:1)

有一种方法可以使单个扩展器的标题和内容具有单独的布局,因此它们可以位于单独的网格单元格中,甚至可以位于窗口的完全独立部分中。对于你真正想要完成的事情来说,这可能有点过头了,但现在是:

  1. 使用标题创建一个扩展器,但是空体。将它放在上部单元格中。
  2. 使用您想要的主体创建另一个扩展器,但将其Template属性设置为仅包含ContentPresenter的模板,因此不会显示任何标头。把它放在下面的牢房里。
  3. 将第二个扩展器的IsExpanded属性绑定到第一个扩展器的IsExpanded属性
  4. 可选择调整Tab键顺序,使两个Expanders在一起
  5. 现在,当您展开上部扩展器时,下部扩展器也会扩展。如果它们之间没有间隙,它们就好像是一个扩展器一样。

    另一个可能有效的选项是使用单个Expander并修改其模板,使其整个标题(包括按钮)具有VerticalAlignment =“Bottom”,并且位于零大小的Canvas中。在这种情况下,整个扩展器将进入您的下部单元。这样做的缺点是上层单元的布局不会意识到扩展器使用的空间,因此根据z顺序,它可能会在其上方或下方放置其他控件。