2010-11-22 5 views
8

Sto usando una griglia WPF come layout della mia finestra. Ha due colonne e un numero qualsiasi di righe. La prima colonna viene utilizzata specificamente per le etichette e la seconda colonna viene utilizzata per i campi di input dell'utente (ad esempio TextBox, ComboBox, ecc.). I miei requisiti sono:WPF TextBlock.TextTrimming non funziona con ColumnDefinition con dimensioni automatiche

  1. La prima colonna deve avere una larghezza minima di 50 e massima larghezza 180.
  2. La prima dimensione colonna mosto al contenuto eccetto quando sfida il primo requisito.
  3. La seconda colonna deve occupare tutto lo spazio rimanente.

ho provato il codice XAML di seguito:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" MinWidth="50" MaxWidth="180" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <TextBlock Text="First Name" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Column="1" Text="{Binding FirstName}" /> 

    <TextBlock Grid.Row="1" Text="Family Name" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding FamilyName}" /> 

    <TextBlock Grid.Row="2" Text="Label That Won't Fit in 180 units" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Text}" /> 
</Grid> 

Speravo che la terza etichetta di fila, "Etichetta che non si adatta in 180 unità", verrà troncato in qualcosa come "Etichetta che ha vinto ... ". Invece, è appena stato tagliato in "Etichetta che non sarà" con metà della "t" mancante.

Ho provato un approccio diverso che ho trovato sul Web da qualche parte.

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition x:Name="LabelColumn" Width="Auto" MinWidth="50" MaxWidth="180" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <TextBlock Width="{Binding ActualWidth, ElementName=LabelColumn}" Text="First Name" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Column="1" Text="{Binding FirstName}" /> 

    <TextBlock Grid.Row="1" Width="{Binding ActualWidth, ElementName=LabelColumn}" Text="Family Name" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding FamilyName}" /> 

    <TextBlock Grid.Row="2" Width="{Binding ActualWidth, ElementName=LabelColumn}" Text="Label That Won't Fit in 180 units" TextTrimming="CharacterEllipsis" /> 
    <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Text}" /> 
</Grid> 

Ha finito per funzionare su Expression Blend (a volte ...) ma non quando si esegue l'applicazione. Durante la corsa, tutte le etichette sono scomparse completamente. Ho visto attraverso la finestra di controllo che tutti i TextBlock hanno una larghezza effettiva di 0 mentre LabelColumn.ActualWidth è uguale a 80.

Quali altre opzioni ci sono?

risposta

7

È necessario avere il set MinWidth e MaxWidth sul TextBlock, come l'impostazione MinWidth e MaxWidth sulle definizioni delle colonne non è sempre onorato il rendering. L'utilizzo di ActualWidth all'interno delle espressioni di collegamento può essere problematico poiché ActualWidth viene impostato durante più passaggi di rendering e può dare risultati imprevedibili