2016-07-13 44 views
0

基本上我想Canvas的行爲像一個StackPanel。那麼如何根據Canvas.Bottom設置另一個元素Canvas.Top=""基於另一個元素的畫布位置

背景:試圖製作一個Expander,當它展開時它會超越其他元素。使用CanvasZIndex來計算是最好的方法。所以我創造了這個:

<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.BottomMyExpanderNaN這樣就不會去上班。

僅供參考如果有更好的方法來做Expander擴大在我打開的元素頂部以及。

謝謝

回答

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

對象的正確解析
相關問題