Lassen Sie TextBox zu der Größe verändert werden, aber nicht auf Benutzereingaben wachsen

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe einen Text in einem Fenster definiert wie folgt:

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

Das Problem ist, dass, wenn der Benutzer in dem Textfeld nach rechts erweitert, da nur die MinWidth gesetzt. Was ich wirklich will, ist der Text in der nächsten Zeile umbrochen. Ich kann es bekommen, dies zu tun, wenn ich die MinWidth auf der Spalte zu ändern, anstatt Breite zu sein. Allerdings, wenn ich dies tun, dann ist die TextBox nicht mehr ändert die Größe, wenn die Fenstergröße verändert wird.

Gibt es eine Möglichkeit, ich beides haben kann? (Das heißt die Größe nur auf Fenstergröße ändern, sonst wickelt)

War es hilfreich?

Lösung

Der Grund, warum Sie dieses Verhalten sind mit ist, weil Sie die festgelegt haben Fensters SizeToContent Eigenschaft - das ist im Grunde das Fenster autorisiert sich auf die Größe von seinem Inhalt angefordert, um die Größe basiert. So wie Sie mehr Material geben, sagt die Textbox ich mehr Platz benötigen, wächst das Fenster folgsam. Ihre Textbox würde nicht wachsen, wenn Sie nicht setzen die SizeToContent Eigenschaft.

Also würde ich sagen, dass die SizeToContent Eigenschaft Setter & Verwendung proportional Gitter Schlichte verlieren. Hier sage ich Spalte # 2 die doppelte Breite der Spalte # 1 machen. Der Standard „Stretch“ Wert von Horizontal und Vertical für das Grid sollte sicherstellen, dass Ihre Steuerelemente in einem Fenster Resize korrekt ändern.

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

Wenn Sie nur die Setter SizeToContent Eigenschaft hinzufügen zurück oben Code-Schnipsel ... Sie würden einige seltsame Verhalten sehen, wo die Textbox zunächst mit Textinhalt wächst .. aber wenn Sie das Fenster einmal die Größe .. die Textbox wachsen würde aufhören . Seltsam ... kann dieses Verhalten nicht erklären.
HTH

Andere Tipps

WPF TextBox scheint nicht von dieser Möglichkeit zu haben, eingebaut.

Um dieses Problem zu lösen, können Sie eine benutzerdefinierte TextBox verwenden, die eine gewünschte (0, 0) Größe berichtet. Es ist ein hässlicher Hack, aber es funktioniert.

In Ihrer MainWindow.xaml.cs-Datei:

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

Dann in Ihrer MainWindow.xaml-Datei:

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

das zweite Column ändern Width = "*" zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top