2013-11-20 3 views
2

Я пытаюсь разработать элемент управления 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> 
+1

Можете ли вы не просто установить значение высоты текста в Auto в триггер? –

+0

@ sa_ddam213 Если я это сделаю, то, что я установил для моей высоты сетки? Авто тоже? Если у меня есть высота сетки, установленная в значение, то TextBlock будет большой, но будет просто отключен текст. Я также не знаю, что указывать * как RowHeight означает, что высота сетки Auto. – sohum

+1

Я бы обернул кнопку и TextBlock в своем собственном контейнере и привязал высоту Grids к ActualHieght этого контейнера, используя hardcoded значения сделают вещи намного сложнее –

ответ

1

Ответ был предоставлен sa_ddam213. Если он обновит этот вопрос с ответом, я буду отмечать его как правильно. В основном содержащее Grid, имеющее высоту 140, будет иметь высоту, установленную в Auto.

Смежные вопросы