基本上我希望Canvas
像StackPanel
一样行事。那么如何根据另一个元素的Canvas.Top=""
设置Canvas.Bottom
?
背景:尝试制作Expander
时,展开时会覆盖其他元素。使用Canvas
ZIndex
进行计算将是执行此操作的最佳方式。所以我创造了这个:
<StackPanel Orientation="Vertical" >
<Canvas Height="{Binding ActualHeight, ElementName=MyExpander}">
<Expander Panel.ZIndex="1" Name="MyExpander" Header="Header" >
<StackPanel Background="LightGray">
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
<TextBlock Text="Some text" />
</StackPanel>
</Expander>
<StackPanel Panel.ZIndex="0" Canvas.Top="20" Margin="0,5,0,0">
<Button Content="Button1" />
<Button Content="Button2" />
<Button Content="Button3" />
</StackPanel>
</Canvas>
</StackPanel>
现在这完全可以解决问题是Canvas.Top="20"
被硬编码到XAML中。这意味着如果字体增加(用户增加了Windows中的字体大小),则部分StackPanel
将位于Expander
之下。我试过这个:
Canvas.Bottom="{Binding (Canvas.Bottom),ElementName=MyExpander}"
问题在于Canvas.Bottom
的{{1}}的值为MyExpander
,因此无法正常工作。
仅供参考,如果有更好的方法可以将NaN
扩展到我对此开放的元素之上。
感谢
答案 0 :(得分:0)
嗯,这似乎不是最好的答案,但它对我有用。
foreach (var exp in MyCanvas.Children)
{
Expander ep = (Expander)exp;
double h = ep.ActualHeight;
Canvas.SetTop(ep, y);
y = y + h + 20;
}
应该注意,由于foreach
MyCanvas
循环有点复杂