Я пытаюсь разработать элемент управления WPF, в котором есть TextBlock
. Этот элемент управления будет отображаться в DataTemplate
для ItemsControl
. В этом элементе управления я хочу, чтобы элемент управления по умолчанию имел фиксированную высоту (допустим, 150 для установки базовой линии). TextBlock
будет обрезать его содержимое в зависимости от количества пикселей. У меня также есть кнопка «Развернуть», что я хочу, чтобы поведение расширения этого текстового поля было желаемой высотой, чтобы весь текст отображался без какой-либо обрезки.Проектирование WPF-элемента управления с расширяемым TextBlock
У меня есть обрезка, работающая до тех пор, пока моя высота TextBlock не ограничена, на основе кода here. Кажется, мне, возможно, придется спуститься по настраиваемому маршруту управления и переопределить Arrange
и Measure
, но я надеялся, что смогу решить это только с помощью XAML.
My ViewModel будет иметь свойство IsExpanded
, которое команда ToggleTextExpansionCommand
будет переключаться при выполнении. Я не уверен, что я должен делать на моем IsExpanded
триггере, чтобы сделать расширение TextBlock
, чтобы занять всю комнату, в которой он нуждается.
Мои DataTemplate
прямо сейчас выглядит следующим образом:
<DataTemplate>
<Grid Height="140">
<Grid.RowDefinitions>
<!-- other rows exist -->
<RowDefinition Height=*" /> <!-- textblock row -->
</Grid>
<!-- other content -->
<TextBlock x:Name="MyTextBlock" Grid.Row="2" Text="{Binding MyText}" />
<Button x:Name="ExpanderButton" Command="{Binding ToggleTextExpansionCommand}" Visibility="Collapsed" />
</Grid>
<DataTemplate.Triggers>
<Trigger SourceName="MyTextBlock" Property="Controls:TextBlockServices.IsTextTrimmed" Value="True">
<Setter TargetName="ExpanderButton" Property="Visibility" Value="Visible" />
</Trigger>
<DataTrigger Binding="{Binding IsExpanded}" Value="True">
<!-- what do I do here?? -->
</DataTrigger>
</DataTemplate.Triggers />
</DataTemplate>
Можете ли вы не просто установить значение высоты текста в Auto в триггер? –
@ sa_ddam213 Если я это сделаю, то, что я установил для моей высоты сетки? Авто тоже? Если у меня есть высота сетки, установленная в значение, то TextBlock будет большой, но будет просто отключен текст. Я также не знаю, что указывать * как RowHeight означает, что высота сетки Auto. – sohum
Я бы обернул кнопку и TextBlock в своем собственном контейнере и привязал высоту Grids к ActualHieght этого контейнера, используя hardcoded значения сделают вещи намного сложнее –