2009-03-03 11 views
12

J'ai une zone de texte définie à l'intérieur d'une fenêtre comme ceci:Laisser TextBox à redimensionnée, mais pas de se développer sur l'entrée utilisateur

<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 les types d'utilisateur dans la zone de texte, il se développe à droite depuis seul le MinWidth est défini. Ce que je veux vraiment, c'est le texte à ajouter à la ligne suivante. Je peux l'obtenir pour faire ceci si je change la MinWidth sur la colonne pour être la Largeur à la place. Cependant, si je fais cela, le TextBox ne se redimensionne plus lorsque la fenêtre est redimensionnée.

Y at-il un moyen que je peux avoir les deux? (c'est-à-dire redimensionner uniquement sur le redimensionnement de la fenêtre, sinon retour à la ligne)

Répondre

15

La raison de ce comportement est que vous avez défini la propriété Window SizeToContent de Windows - qui autorise la fenêtre à se redimensionner en fonction de la taille demandée par son contenu. Alors que vous tapez plus de choses, la boîte de texte dit que j'ai besoin de plus d'espace, la fenêtre se développe docilement. Votre zone de texte ne se développerait pas si vous ne définissez pas la propriété SizeToContent. Donc, je dirais perdre le setter de propriété SizeToContent & Utilisez le dimensionnement de la grille proportionnelle. Ici, je dis que la Colonne # 2 fait deux fois la largeur de la Colonne # 1. La valeur "Stretch" par défaut de HorizontalAlignment et VerticalAlignment pour la grille doit garantir que vos contrôles redimensionner correctement sur un redimensionnement de la fenêtre.

<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 juste le setter de propriété SizeToContent Retour à l'extrait de code ci-dessus ... vous verriez un comportement bizarre où la zone de texte se développe d'abord avec le contenu du texte .. si vous redimensionnez la fenêtre une fois .. la textbox cesserait de croître. Étrange ... ne peut pas expliquer ce comportement.
HTH

0

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

+1

Cela va encore croître la zone de texte. En utilisant * implique - utiliser le reste de la largeur disponible pour la Colonne # 2 – Gishu

3

La zone de texte de WPF ne semble pas avoir cette option intégrée.

Pour résoudre ce problème, vous pouvez utiliser un TextBox personnalisé qui indique la taille souhaitée (0, 0). C'est un hack moche, 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>