wpf 如何防止具有TextTrimming CharacterEllipsis的TextBlock以自动宽度扩展列

wz3gfoph  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(142)

我有以下XAML

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="0" Text="Hello World" />
        <TextBlock Grid.Row="1" Grid.Column="0" Text="Hello ABC DEF World" TextTrimming="CharacterEllipsis" />
    </Grid>
</Window>

这将产生以下用户界面:

我希望TextBlock“Hello ABC DEF World”修剪而不扩展列宽。
要获得此结果,请执行以下操作:

编辑:

要指出

  • 我不需要它是Grid,它可以是任何内容控件(StackPanelDockPanlCanvas等等)
  • 我不需要它是TextBlock,它可以是任何控件(RunLabel等)

如果我的愿望是可能的与不同的组合控制,我非常愿意给予它一个尝试。
我想要的非代码术语:

  • 我需要2行文本,第一行文本是“主要”信息,第二行文本是“次要”信息。
  • “主要”信息应充分伸展以显示其全文。
  • “次要”信息应该只延伸到主要的,而不是更多,如果它是更长的,它应该修剪

我知道我可以通过以下XAML实现这个目标:

<TextBlock ...
           x:Name="MainInfo" />
<TextBlock ...
           MaxWidth="{Binding Mode=OneWay, Path=ActualWidth, ElementName=MainInfo}" />

但如果可能的话,我想避免ActualWidth上的Binding
我希望HorizontalAlignment = Left;能阻止TextBlock的伸展欲望,但事实并非如此。

dkqlctbz

dkqlctbz1#

但如果可能的话,我不想在ActualWidth上使用绑定。
Auto实际上意味着列将随着其中最宽的元素沿着增长,即本例中的“次要”信息TextBlock
因此,您应该将列的Width设置为MainInfoActualWidth,例如,使用绑定。或者以编程方式。无论哪种方式,您都必须以某种方式进行设置。

ekqde3dh

ekqde3dh2#

您可以通过多种方式实现这一点。
取决于确切的预期目的。
一个明显而简单的例子是使用一些诡计
您可以将主文本块和一个矩形放在一个水平对齐的堆栈面板中,行跨度为2,Z索引高于辅助文本块。您可以将矩形的高度设置为两个文本块的总和,宽度必须由您根据所需的规格进行设置。两个文本块必须设置固定的高度。并且在堆栈面板内具有矩形的文本块必须在堆栈面板内与顶部垂直对齐。如果正确实现,结果应该是一个矩形,它覆盖了辅助文本块的一部分,使辅助文本块大于主文本块。

相关问题