Consentire a TextBox di essere ridimensionato ma non di aumentare in base all'input dell'utente

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

  •  03-07-2019
  •  | 
  •  

Domanda

Ho un TextBox definito all'interno di una finestra in questo modo:

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

Il problema è che quando l'utente digita la TextBox si espande verso destra poiché è impostata solo la MinWidth. Quello che voglio davvero è che il testo si sposti alla riga successiva. Posso farlo farlo se cambio invece Larghezza minima sulla colonna in Larghezza. Tuttavia, se lo faccio, TextBox non viene più ridimensionato quando viene ridimensionata la finestra.

C'è un modo in cui posso avere entrambi? (ovvero ridimensiona solo su ridimensionamento di Windows, altrimenti avvolgi)

È stato utile?

Soluzione

Il motivo per cui stai riscontrando questo comportamento è perché hai impostato la proprietà SizeToContent di Window , che sostanzialmente autorizza la finestra a ridimensionare se stessa in base alle dimensioni richieste dal suo contenuto. Quindi, mentre digiti più cose, la casella di testo dice che ho bisogno di più spazio, la finestra cresce obbedientemente. La tua casella di testo non aumenterebbe se non imposti la proprietà SizeToContent.

Quindi direi di perdere il setter di proprietà SizeToContent & amp; Usa un dimensionamento della griglia proporzionale. Qui dico di rendere la colonna n. 2 doppia la larghezza della colonna n. 1. L'impostazione predefinita " Stretch " il valore di HorizontalAlignment e VerticalAlignment per la griglia dovrebbe garantire che i controlli vengano ridimensionati correttamente su un ridimensionamento della finestra.

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

Se aggiungi semplicemente il setter proprietà SizeToContent allo snippet di codice sopra ... vedresti qualche strano comportamento in cui la casella di testo inizialmente cresce con il contenuto del testo .. tuttavia se ridimensioni la finestra una volta .. la casella di testo smetterebbe di crescere . Strano ... non riesco a spiegare quel comportamento.
HTH

Altri suggerimenti

TextBox di WPF non sembra avere quell'opzione integrata.

Per risolvere questo problema, puoi usare una TextBox personalizzata che riporta la dimensione desiderata (0, 0). È un brutto trucco, ma funziona.

Nel tuo file 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);
        }
    }
}

Quindi, nel tuo file 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>

Cambia la seconda ColumnDefinition in Larghezza = " * " ;.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top