WPF TextBlock.TextTrimming не работает с автоматически изменяемым размером ColumnDefinition

Я использую WPF Grid в качестве макета моего окна. Он имеет два столбца и любое количество строк . Первый столбец используется специально для ярлыков, а второй столбец используется для полей ввода пользователя (например, TextBox, ComboBox и т. Д.). Мои требования:

  1. Первый столбец должен иметь минимальную ширину 50 и максимальную ширину of 180.
  2. Размер первого столбца должен соответствовать его содержимому, за исключением случаев, когда он не соответствует первому требованию.
  3. Второй столбец должен занимать все оставшееся пространство.

Я пробовал использовать приведенный ниже XAML:

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

Я надеялся, что метка третьей строки, «Метка, которая не умещается в 180 единицах», будет усечена до что-то вроде "Label That Won ...". Вместо этого его просто обрезали до «Метка, которая не будет» с отсутствующей половиной буквы «t».

Я попробовал другой подход, который нашел где-то в Интернете.

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

В итоге он работал над Expression Blend (иногда ...) но не при запуске приложения. При запуске все метки исчезли полностью. Я увидел в окне просмотра, что все текстовые блоки имеют фактическую ширину 0, а LabelColumn.ActualWidth равняется 80.

Какие еще варианты есть?

8
задан Bob 22 November 2010 в 07:51
поделиться