2011-05-04 4 views
4

J'ai une fenêtre WPF avec une grille:Obtenez Largeur réelle WPF Grille

<Grid Name="mainGrid"> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="20*" /> 
    <ColumnDefinition Width="700*" /> 
    <ColumnDefinition Width="190*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
    <RowDefinition Height="80" /> 
    <RowDefinition Height="220*" /> 
    <RowDefinition Height="450*" /> 
    <RowDefinition Height="160*" /> 
    <RowDefinition Height="30" /> 
    </Grid.RowDefinitions> 
</Grid> 

Dans le codebehind, j'ajoute un StackPanel à la 1ère colonne, 2e rangée de mainGrid, mais je manque la largeur max de l'empilement de la largeur de la colonne 1 - 50px. Je suis tombé accross stkPanel.Width = mainGrid.ColumnDefinitions(1).Width.ToString - 50, mais cela erreur avec:

700 * ne peuvent être convertis pour doubler

Y at-il un moyen d'obtenir la largeur réelle de la colonne de la grille telle qu'elle apparaît à l'écran pour utiliser comment je veux, ou est-ce que je mets du rembourrage ou similaire?

Merci,

Matt

Répondre

3

se trouve que j'étais presque. Au lieu d'utiliser

stkPanel.Width = mainGrid.ColumnDefinitions [1] .Width.ToString - 50

Je l'ai utilisé

stkPanel.Width = mainGrid.ColumnDefinitions [1 ] .ActualWidth.ToString - 50

3

Tout en effectuant vous-même l'arithmétique des tailles de ligne et de colonne, vous devez savoir qu'il existe des pièges h cette approche. Lorsque vos données changent ou que la fenêtre est redimensionnée, la mise en page de la grille est mise à jour et tout peut changer. Bien sûr, vous pouvez vous adapter à ces changements, mais c'est plus de travail. Au lieu de cela, si vous le pouvez, vous pouvez essayer de tout faire avec la grille elle-même en utilisant une colonne et une colonne supplémentaires. Ensuite, la grille s'occupera de tout le sale boulot et vous pourrez vous concentrer sur l'apparence.

4

Vous avez deux propriétés pour une Grid:

Grid g = new Grid(); 
double width1 = g.ActualWidth; 
double width2 = g.RenderSize.Width; 

Ces deux devraient faire l'affaire, essayez

0

Vous devez utiliser ActualWidth et ActualHeight. Par exemple:

stkPanel.Width = mainGrid.ColumnDefinitions[1].ActualWidth - 50; 
Questions connexes