WPF TextBlock.TextTrimming не работает с автоматическим определением размера столбца - PullRequest
8 голосов
/ 22 ноября 2010

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

  1. Первый столбец должен иметь минимальную ширину 50 и максимальную ширину 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 единиц», будет усечена до чего-то вроде «Метка, которая выиграла…» Вместо этого он просто обрезался до «Метка, которая не будет» с отсутствующей половиной буквы «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.

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

1 Ответ

7 голосов
/ 22 ноября 2010

Вам необходимо установить MinWidth и MaxWidth в TextBlock, так как установка MinWidth и MaxWidth в определениях столбцов не всегда учитывается при рендеринге.Использование ActualWidth в выражениях связывания может быть проблематичным, поскольку ActualWidth устанавливается во время нескольких проходов рендеринга и может дать непредсказуемые результаты

...