画布位置基于另一个元素

时间:2016-07-13 16:07:51

标签: wpf canvas

基本上我希望CanvasStackPanel一样行事。那么如何根据另一个元素的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扩展到我对此开放的元素之上。

感谢

1 个答案:

答案 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循环有点复杂