2010-11-22 7 views
8

Używam siatki WPF jako układu okna. Ma dwie kolumny i dowolną liczbę wierszy. Pierwsza kolumna jest używana specjalnie dla etykiet, a druga kolumna służy do wprowadzania danych przez użytkownika (np. TextBox, ComboBox itd.). Moje wymagania to:Funkcja TextFlock wtyczki WPF. Nie działa z funkcją Auto-size ColumnDefinition

  1. Pierwsza kolumna musi mieć minimalną szerokość 50 i maksymalną szerokość 180.
  2. pierwszy rozmiar kolumna musi do jego treści, z wyjątkiem, gdy przeciwstawia pierwszego wymogu.
  3. Druga kolumna musi zajmować całe pozostałe miejsce.

Próbowałem XAML poniżej:

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

miałem nadzieję, że w trzecim rzędzie etykiety „etykieta, która nie zmieści się w 180 jednostkach”, zostanie obcięty do czegoś takiego jak „Label, który wygrał ... ". Zamiast tego został przycięty do "Label That Will not" z połową "t".

Próbowałem inne podejście znalazłem gdzieś w Internecie.

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

Skończyło się na pracy z Expression Blend (czasami ...), ale nie podczas uruchamiania aplikacji. Podczas pracy wszystkie etykiety zniknęły całkowicie. W oknie obserwacyjnym widziałem, że wszystkie blokady TextBlock mają rzeczywistą szerokość równą 0, a wartość LabelColumn.ActualWidth równa się 80.

Jakie są inne opcje?

Odpowiedz

7

Trzeba mieć zestaw MinWidth i MaxWidth na TextBlock, jak ustawienie MinWidth i MaxWidth na definicjach kolumn nie zawsze honorowane na renderingu. Używanie ActualWidth w wyrażeniach wiążących może być problematyczne ponieważ ActualWidth jest ustawione podczas wielu przejść renderowania i może dać nieprzewidywalne wyniki.

Powiązane problemy