【问题标题】:Designing a WPF control that has an expandable TextBlock设计具有可扩展 TextBlock 的 WPF 控件
【发布时间】:2013-11-20 20:49:42
【问题描述】:

我正在尝试开发一个包含TextBlock 的 WPF 控件。此控件将显示在DataTemplate 中,对应ItemsControl。在这个控件中,我希望控件默认具有固定的高度(比如说 150 来设置基线)。 TextBlock 将根据可用像素的数量修剪其内容。我还有一个“扩展”按钮,我希望该按钮具有将该文本框扩展为所需高度的行为,以使所有文本显示而无需任何修剪。

只要我的 TextBlock 高度不受限制,我就可以根据代码 here 进行修剪检测。看来我可能不得不走自定义控制路线并覆盖 ArrangeMeasure 但我希望我可以只用 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,使用硬编码值会使事情变得更加困难
  • 嗯....这可能很棘手,因为除了这两个之外还有更多控件。但我可以沿着这条路走下去看看结果如何。

标签: c# wpf xaml textblock


【解决方案1】:

答案由 sa_ddam213 提供。如果他用答案更新此问题,我会将其标记为正确。基本上包含高度为 140 的 Grid 将高度设置为 Auto。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多