Comment appliquer un Contrôle de zone de texte Modèle?

Je vais essayer de simplifier un peu de code et d'améliorer ma gestion.

J'ai d'abord été la recherche d'un moyen d'avoir une zone de texte aligné à gauche, qui peut rétrécir et de l'étendre à un maximum de valeur sans centrage à l'intérieur d'une cellule de la grille après avoir atteint la valeur maximale.

J'ai donc commencé à écrire un peu de code comme ceci...

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <TextBox Text="Some text"
             VerticalAlignment="Center"
             HorizontalAlignment="Stretch"
             Margin="10"
             MaxWidth="150" />
</Grid>

(Code 1)

Et qui donne quelque chose comme ceci...

Comment appliquer un Contrôle de zone de texte Modèle?

(Figure 1)

Comme vous pouvez le voir, cette centres de la zone de texte avec un max de largeur, mais il est aligné au centre de la cellule de la grille.

Alors j'ai pensé que peut-être que si j'ai changé l'alignement horizontal de la zone de texte comme si...

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <TextBox  Text="Some text"
              VerticalAlignment="Center"
              HorizontalAlignment="Left"
              Margin="10"
              MaxWidth="100" />
</Grid>

(Code 2)

Mais malheureusement, seulement donne quelque chose comme ceci...

Comment appliquer un Contrôle de zone de texte Modèle?

(Figure 2)

Encore une fois, ce n'est pas juste, parce que, en dépit de tout l'espace vide sur la droite, la zone de texte n'est pas l'expansion de sa largeur maximale est de 100 comme je veux.

Finalement, j'ai trouvé que si vous mettez la zone de texte à l'intérieur d'une grille imbriquée, vous allez obtenir l'effet désiré.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"
                              MaxWidth="120" />
            <ColumnDefinition Width="0*" />
        </Grid.ColumnDefinitions>
        <TextBox Text="Some text"
             VerticalAlignment="Center"
             HorizontalAlignment="Stretch"
             Margin="10"
             MaxWidth="100" />
    </Grid>
</Grid>

(Code 3)

Qui donne cette...

Comment appliquer un Contrôle de zone de texte Modèle?

(Figure 3)

Comme vous pouvez le voir, la grille imbriquée remplit tout à 200 à l'échelle de l'espace, mais la zone de texte remplit de gauche à 100, et les feuilles de l'espace vide sur la droite. (Si cette fenêtre est re-extensible, il permettra de réduire et développer de façon appropriée)

Je voudrais appliquer les méthodes de la exemple de Code 3 à un style ou d'un modèle de contrôle, afin que je puisse couverture de l'appliquer à des zones de texte où cette situation est applicable.

Dans un scénario parfait, je ferais quelque chose comme...

<TextBox Text="Some text"
         VerticalAlignment="Center"
         HorizontalAlignment="Stretch"
         Margin="10"
         MaxWidth="100"
         Style="{StaticResource ExpandingTextBox}" /> 

(Code 4)

Et d'atteindre les mêmes résultats que Figure 3.

J'ai essayé les...

<Style TargetType="{x:Type TextBox}"
       x:Key="ExpandingTextBox">
    <Setter Property="OverridesDefaultStyle"
            Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*"
                                          MaxWidth="170" />
                        <ColumnDefinition Width="0*" />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

(Code 5)

Mais que des causes justes, la zone de texte à disparaître à partir de mon formulaire tous ensemble. Je ne suis pas très bon à l'écriture des modèles de ce genre, donc je suis un peu à perte.

Aussi, une chose que je viens de réaliser, c'est que la largeur de la colonne imbriquée = MaxWidth + 2 x Marge. Je ne me dérangerait pas de réglage de la largeur de la colonne de manière explicite dans la zone de texte de la déclaration, mais si elle pouvait être automatique, ce serait génial.

OriginalL'auteur imdandman | 2013-04-25