Я использую WPF Grid в качестве макета моего окна. Он имеет два столбца и любое количество строк. Первый столбец используется специально для меток, а второй столбец используется для полей пользовательского ввода (например, TextBox, ComboBox и т. Д.). Мои требования:
- Первый столбец должен иметь минимальную ширину 50 и максимальную ширину 180.
- Размер первого столбца должен соответствовать его содержимому, кроме случаев, когда он не соответствует первому требованию.
- Второй столбец должен занимать все оставшееся пространство.
Я попробовал 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.
Какие еще есть варианты?