Autoriser le redimensionnement de la zone de texte, mais pas sa taille lors de la saisie par l'utilisateur

StackOverflow https://stackoverflow.com/questions/604952

  •  03-07-2019
  •  | 
  •  

Question

J'ai une zone de texte définie dans une fenêtre comme suit:

<Window x:Class="NS.MainWindow"
    ...
    SizeToContent="WidthAndHeight">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition MinWidth="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>

        <TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
    </Grid>
</Window>

Le problème est que lorsque l'utilisateur tape dans la zone de texte, il se développe à droite car seule la MinWidth est définie. Ce que je veux vraiment, c’est que le texte passe à la ligne suivante. Je peux le faire si je change la largeur de la colonne en largeur. Toutefois, si je le fais, la zone de texte ne sera plus redimensionnée lorsque la fenêtre sera redimensionnée.

Existe-t-il un moyen de combiner les deux? (c'est-à-dire redimensionner uniquement lors du redimensionnement de la fenêtre, sinon retour à la ligne)

Était-ce utile?

La solution

Ce comportement s'explique par le fait que vous avez défini la propriété SizeToContent de la fenêtre , qui autorise la fenêtre à se redimensionner en fonction de la taille demandée par son contenu. Ainsi, au fur et à mesure que vous tapez plus de texte, la zone de texte indique que j'ai besoin de plus d'espace, la fenêtre s'agrandit docilement. Votre zone de texte ne grossira pas si vous ne définissez pas la propriété SizeToContent.

Je dirais donc que vous devez perdre la propriété SizeToContent setter & amp; Utilisez le dimensionnement proportionnel de la grille. Je dis ici que la colonne 2 doit être deux fois plus large que la colonne 1. Le paramètre par défaut "Etirer". La valeur de HorizontalAlignment et VerticalAlignment pour la grille doit permettre de redimensionner correctement vos contrôles dans une fenêtre redimensionnée.

<Window ...
    Title="MyWindow" WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip"
        MinWidth="300" Width="300" Height="80">
    <Grid x:Name="myGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" MinWidth="100"/>
            <ColumnDefinition Width="2*" MinWidth="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50" />
        </Grid.RowDefinitions>

        <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>
        <TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow"/>
    </Grid>

Si vous ajoutez simplement le configurateur de propriété SizeToContent à l'extrait de code ci-dessus ... vous constaterez un comportement étrange: la zone de texte s'agrandit initialement avec du contenu texte .. cependant, si vous redimensionnez la fenêtre une fois ... la zone de texte cesse de croître . Étrange ... je ne peux pas expliquer ce comportement.
HTH

Autres conseils

TextBox de WPF ne semble pas avoir cette option intégrée.

Pour résoudre ce problème, vous pouvez utiliser une zone de texte personnalisée signalant la taille souhaitée (0, 0). C'est un bidule laid, mais ça marche.

Dans votre fichier MainWindow.xaml.cs:

namespace NS
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        ...
    }

    // Ugly HACK because the regular TextBox doesn't allow autoresize to fit the parent but NOT autoresize when the text doesn't fit.
    public class TextBoxThatDoesntResizeWithText : TextBox
    {
        protected override Size MeasureOverride(Size constraint)
        {
            return new Size(0, 0);
        }
    }
}

Ensuite, dans votre fichier MainWindow.xaml:

<Window x:Class="NS.MainWindow"
    ...
    xmlns:local="clr-namespace:NS"
    SizeToContent="WidthAndHeight">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition MinWidth="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>

        <local:TextBoxThatDoesntResizeWithText Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
    </Grid>
</Window>

Modifiez la deuxième ColumnDefinition pour qu'elle soit Width = "*".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top