【发布时间】:2013-11-20 20:49:42
【问题描述】:
我正在尝试开发一个包含TextBlock 的 WPF 控件。此控件将显示在DataTemplate 中,对应ItemsControl。在这个控件中,我希望控件默认具有固定的高度(比如说 150 来设置基线)。 TextBlock 将根据可用像素的数量修剪其内容。我还有一个“扩展”按钮,我希望该按钮具有将该文本框扩展为所需高度的行为,以使所有文本显示而无需任何修剪。
只要我的 TextBlock 高度不受限制,我就可以根据代码 here 进行修剪检测。看来我可能不得不走自定义控制路线并覆盖 Arrange 和 Measure 但我希望我可以只用 XAML 解决这个问题。
我的 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>
【问题讨论】:
-
你不能只在触发器中将 TextBlock Height 设置为 Auto 吗?
-
@sa_ddam213 如果我这样做,那么我应该将网格高度设置为多少?汽车也行?如果我将网格高度设置为一个值,那么 TextBlock 会很大,但它只会截断文本。如果网格高度为 Auto,我也不知道将 * 指定为 RowHeight 意味着什么。
-
我会将按钮和 TextBlock 包装在其自己的容器中,并将 Grids 高度绑定到该容器的 ActualHieght,使用硬编码值会使事情变得更加困难
-
嗯....这可能很棘手,因为除了这两个之外还有更多控件。但我可以沿着这条路走下去看看结果如何。