2010-03-27 4 views
1

J'ai deux commandes d'utilisateur disposées verticalement dans une grille, les deux pouvant s'étendre pour être plus grandes que la grille ne peut en contenir. Je les ai mis dans chacun dans un scrollviewer qui fonctionne fonctionnellement. Ce que je veux cependant, c'est leur donner de l'espace en proportion de la quantité qu'ils veulent à l'exécution.Taille de ligne/colonne de la grille WPF dans Proportion to DesiredSize?

Donc, s'il y a 500 hauteur disponible, le contrôle supérieur veut 400 et la partie inférieure 600, le contrôle supérieur obtiendrait 200 et le fond 300.

je ne sais pas au moment de la conception de combien d'espace chacun voudra en proportion à l'autre, donc en utilisant 1 *, 2 * etc. pour la hauteur de la rangée ne fonctionnera pas pour moi.

Je peux coder à la main le dimensionnement proportionnel à l'exécution, mais ai-je manqué une astuce simple dans XAML qui me donnerait ce que je veux?

Le contexte est la suivante (rogné par souci de concision) ...

<Grid> 
    <TabControl> 
     <TabItem> 
      <Grid> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="*"/> 
         <RowDefinition Height="*"/> 
        </Grid.RowDefinitions> 
        <GroupBox Grid.Row="0" Header="Title Area" /> 
        <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"> 
         <UserControl /> 
        </ScrollViewer> 
        <ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto"> 
         <UserControl /> 
        </ScrollViewer> 
       </Grid> 
      </Grid> 
     </TabItem> 
    </TabControl>  
</Grid> 
+0

Je pense que vous devrez changer la taille du code. –

Répondre

1

je vais le prendre qu'il n'y a pas moyen facile de le faire dans XAML, donc je avoir recours à code-behind. La façon dont je l'ai fait est donc, dans le XAML;

<Grid> 
    <TabControl> 
     <TabItem> 
      <Grid> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Name="FooRow" Height="*"/> 
         <RowDefinition Name="BarRow" Height="*"/> 
        </Grid.RowDefinitions> 
        <GroupBox Grid.Row="0" Header="Title Area" /> 
        <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"> 
         <UserControl Name="Foo" SizeChanged="Foo_SizeChanged" /> 
        </ScrollViewer> 
        <ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto"> 
         <UserControl Name="Bar" SizeChanged="Bar_SizeChanged" /> 
        </ScrollViewer> 
       </Grid> 
      </Grid> 
     </TabItem> 
    </TabControl> 
</Grid> 

Dans le code-behind;

private void Foo_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     FooRow.Height = new GridLength(e.NewSize.Height, GridUnitType.Star); 
    } 

    private void Bar_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     BarRow.Height = new GridLength(e.NewSize.Height, GridUnitType.Star); 
    } 

Vous pouvez également le faire avec des fixations et un ValueConverter.

Questions connexes