2016-07-13 14 views
0

Grundsätzlich möchte ich eine Canvas wie ein StackPanel handeln. Also, wie setzt man die Canvas.Top="" basierend auf Canvas.Bottom eines anderen Elements?Canvas Position basierend auf einem anderen Element

Hintergrund: Versuchen, eine Expander zu machen, dass bei der Erweiterung wird es über andere Elemente gehen. Unter Verwendung einer CanvasZIndex wäre der beste Weg, dies zu tun. Also habe ich dies:

<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> 

Jetzt funktioniert das perfekt das Problem ist, dass Canvas.Top="20" in das XAML fest einprogrammiert ist. Das heißt, wenn die Schriftart erhöht wird (der Benutzer hat die Schriftgröße in Windows erhöht), dann wird ein Teil der StackPanel unter der Expander sein. Ich versuchte dies:

Canvas.Bottom="{Binding (Canvas.Bottom),ElementName=MyExpander}" 

Das Problem dafür ist, dass Wert für für Canvas.Bottom für MyExpander ist NaN so ist, dass nicht zur Arbeit gehen.

FYI wenn es eine bessere Möglichkeit gibt, die Expander erweitert über die Spitze der Elemente zu machen, bin ich dazu auch offen.

dank

Antwort

0

Gut, das scheint nicht, wie die größte Antwort, aber es funktionierte für mich.

foreach (var exp in MyCanvas.Children) 
    { 
     Expander ep = (Expander)exp; 
     double h = ep.ActualHeight; 
     Canvas.SetTop(ep, y); 
     y = y + h + 20; 
    } 

sollten beachten, ist es selbstverständlich, dass foreach Schleife ein wenig aufgrund korrekte Analyse der Objekte ist komplizierter in der MyCanvas

Verwandte Themen