2009-03-03 21 views
12

Mam TextBox zdefiniowany wewnątrz okna tak:Pozwól TextBox być zmieniany, ale nie rosną na wejściu użytkownika

<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> 

Problemem jest to, że gdy użytkownik wpisze w polu tekstowym to rozszerza się na prawo od ustawiona jest tylko MinWidth. Tym, czego naprawdę chcę, jest tekst do zawijania do następnej linii. Mogę to zrobić, jeśli zmienię wartość MinWidth w kolumnie na szerokość. Jednak jeśli to zrobię, to TextBox nie będzie już zmieniać rozmiaru po zmianie rozmiaru okna.

Czy istnieje sposób, w jaki mogę mieć jedno i drugie? (tj. przeskaluj tylko w przypadku zmiany rozmiaru okna, w przeciwnym razie zawiń)

Odpowiedz

15

Powodem tego zachowania jest ustawienie wartości Window's SizeToContent o nazwie - która zasadniczo zezwala na zmianę rozmiaru okna w oparciu o rozmiar wymagany przez jego zawartość. Kiedy wpisujesz więcej rzeczy, pole tekstowe mówi, że potrzebuję więcej miejsca, a okno posłusznie rośnie. Twoje pole tekstowe nie wzrośnie, jeśli nie ustawisz właściwości SizeToContent.

Powiedziałbym, że utracę ustawnik właściwości SizeToContent. & Użyj proporcjonalnego rozmiaru siatki. Tutaj mówię, aby Kolumna 2 była dwa razy większa od szerokości Kolumny # 1. Domyślna wartość "Stretch" w HorizontalAlignment i VerticalAlignment dla Grid powinna zapewniać odpowiednią zmianę rozmiaru kontrolek przy zmianie rozmiaru okna.

<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> 

Jeśli tylko dodać właściwość setter SizeToContent powrotem do powyższego fragmentu kodu ... chcesz zobaczyć jakieś dziwne zachowanie, gdzie początkowo rośnie tekstowe z zawartości tekstowej .. jednak jeśli rozmiar okna raz .. the textbox przestałby rosnąć. Dziwne ... nie potrafię wyjaśnić tego zachowania.
HTH

0

Zmień drugą definicję kolumny na szerokość = "*".

+1

To będzie nadal rosnąć pole tekstowe. Używając * implikuje - użyj pozostałej dostępnej szerokości dla Kolumny # 2 – Gishu

3

Pole tekstowe WPF nie ma wbudowanej tej opcji.

Aby rozwiązać ten problem, można użyć niestandardowego pola tekstowego, które zgłasza pożądany rozmiar (0, 0). To brzydki hack, ale działa.

W pliku 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); 
     } 
    } 
} 

Następnie w pliku 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> 
Powiązane problemy