Domanda

Ho un problema. Devo ospitare griglia con controlli ScrollViewer per impedire testo da essere troncato o compresso a zero con presso l'interfaccia utente. Anche io voglio la con di casella di testo per essere ampliato quando l'utente larghezza Windows Modifica. Sono la creazione di contenuti di finestra al seguente codice

<DockPanel>
    <TreeView DockPanel.Dock="Left" Width="150"/>
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <TextBlock Text="Name" 
                       Margin="5" 
                       VerticalAlignment="Center"/>
            <TextBox Grid.Column="1"
                     Text="Some Name"
                     Margin="5"
                     VerticalAlignment="Center"
                     MinWidth="200"/>
        </Grid>
    </ScrollViewer>
</DockPanel>

Tutti funzionano bene, ma quando utente digita molto lungo testo in TextBox E 'in fase di espansione e appare di scorrimento orizzontale. C'è un modo semplice per limitare TextBox larghezza massima e permettono di essere ampliato solo quando l'utente cambia la dimensione della finestra.

È stato utile?

Soluzione

Il problema è che gli elementi padre stanno fornendo TextBox con tanto spazio quanto lo ritenga necessario, e quando più di testo è presente si espanderà invece di stare in dimensioni automatica iniziale.

Una soluzione è quella di fare un altro elemento auto-size e legare il TextBox.Width ad esso:

<DockPanel>
    <TreeView Width="150" DockPanel.Dock="Left"/>
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <TextBlock Margin="5" VerticalAlignment="Center" Text="Name"/>
            <Border x:Name="b" Grid.Column="1" Margin="5"/>
            <TextBox Width="{Binding ActualWidth, ElementName=b}"
                     MinWidth="200"
                     Grid.Column="1"
                     Margin="5"
                     VerticalAlignment="Center"
                     Text="Some Name"/>
        </Grid>
    </ScrollViewer>
</DockPanel>

Nota che ci siamo posti la proprietà Margin dell'elemento di dimensionamento automatico (il confine) Questo è importante perché, se non è impostata, ci sarà un ciclo:.

  1. larghezza del bordo autosizes a larghezza della colonna griglia
  2. larghezza TextBox ridimensiona a Border.ActualWidth
  3. larghezza della colonna griglia viene ridimensionata alla larghezza TextBox + margine TextBox
  4. larghezza del bordo autosizes a griglia larghezza della colonna di nuovo

Con l'impostazione del margine per lo stesso del TextBox, il ridimensionamento del controllo TextBox non influenzerà le dimensioni della griglia.

Altri suggerimenti

TextBox.MeasureOverride Overriding in questo modo ha funzionato per me:

protected override Size MeasureOverride(Size constraint)
{
    Size origSize = base.MeasureOverride(constraint);
    origSize.Width = MinWidth;
    return origSize;
}

no - questo è un problema ben noto di WPF e dovrebbe essere risolto nella prossima release. grazie

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