2010-03-13 10 views
7

J'ai un code XAML:Comment avoir un contrôle remplir tout l'espace disponible

<Grid> 
    <WrapPanel> 
    <TextBox ></TextBox> 
    <Button Content="GetIt" /> 
    </WrapPanel> 
</Grid> 

Comment je peux pour obtenir tout l'espace disponible pour textBox?

je veux faire quelque chose comme ça:

| [____________________] [GetIt] |

+2

Quel est l'objectif du WrapPanel? –

+0

Je viens de savoir quelle est la meilleure façon de le faire: P – Neir0

Répondre

7

Il y a plusieurs façons d'y parvenir, y compris celui-ci:

<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition Width="*" /> 
    <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <TextBox /> 
    <Button Grid.Column="1">GetIt</Button> 
</Grid> 
+0

Merci! Puis-je poser une autre question? Comment je peux coller les colonnes de la grille. | [__________] [GetIt] | | ................... | | ... en voici une autre. | .multyline zone de texte. | | ................... | – Neir0

+0

Ohh désolé. Mon commentaire est formatage perdu. Je veux dire que http://img708.imageshack.us/img708/2383/screengw.png – Neir0

+0

Neir0 - Vous essayez d'obtenir l'effet exact pour lequel DockPanel a été conçu. Vous pouvez faire la même chose avec une grille, qui est beaucoup plus flexible, mais il faut beaucoup plus de XAML et nécessite beaucoup de maintenance des valeurs Row/Column/RowSpan/ColumnSpan si vous devez ajouter ou supprimer des éléments. –

3

Essayez ceci:

<Grid> 
    <TextBox HorizontalAlignment="Stretch" Margin="2,2,102,2"></TextBox> 
    <Button HorizontalAlignment="Right" Width="100" Content="GetIt" /> 
</Grid> 

Il suffit de faire le bouton de la largeur désirée et la zone de texte remplis le reste.


Merci pour la prise; corrigé ci-dessus pour gérer correctement la marge à droite. Cela vous oblige cependant à mettre à jour la marge lorsque la largeur du bouton change. Deux colonnes est une meilleure solution si vous prévoyez de changer l'espacement souvent. L'utilisation de la marge est plus propre si vous avez plusieurs contrôles dans la grille et que vous ne souhaitez pas créer de grilles imbriquées pour gérer ce type de fractionnement.

+0

Mais dans ce cas, le bouton est sur la zone de texte. Ici vous pouvez voir la capture d'écran http://img214.imageshack.us/img214/918/screeneb.png – Neir0

+0

C'est une technique que je parie vient d'apprendre à faire la mise en page en CSS sans tableaux. –

+0

C'est aussi le genre de code que Blend «devinera» si vous laissez tomber et redimensionnez des contrôles dans une grille. –

2

La façon la plus simple est d'utiliser un DockPanel au lieu d'une grille (la valeur par défaut pour LastChildFill est vrai, mais j'ai aussi ajouté ici pour plus de clarté):

<DockPanel LastChildFill="True"> 
    <Button Content="GetIt" DockPanel.Dock="Right" /> 
    <TextBox ></TextBox> 
</DockPanel> 
2

est ici un moyen d'atteindre la mise en page que vous » re recherche:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
    <Style TargetType="TextBox"> 
     <Setter Property="Margin" Value="2"/> 
    </Style> 
    </Page.Resources> 
    <DockPanel> 
    <DockPanel DockPanel.Dock="Top"> 
     <!-- Because the Button is fixed in size, you can divide the row it's 
     in using a DockPanel: the Button is docked to the right edge, and the 
     TextBox fills up the remaining available space. --> 
     <Button Margin="2" Padding="2" DockPanel.Dock="Right">GetIt</Button> 
     <TextBox /> 
    </DockPanel> 
    <!-- Because the TextBoxes *aren't* fixed in size, you can't use docking, 
    as it won't size them. So put them in a Grid and use star sizing to 
    divide the grid's vertical space into two equal parts. The Grid will 
    fill up the remainder of the (outer) DockPanel. --> 
    <Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <TextBox Grid.Row="0">Another TextBox</TextBox> 
     <TextBox Grid.Row="1">Yet another TextBox</TextBox> 
    </Grid> 
    </DockPanel> 
</Page> 
Questions connexes