WPF: TextTrimming on a ContentPresenter

本文关键字:ContentPresenter on TextTrimming WPF | 更新日期: 2023-09-27 17:53:13

是否有一种简单的方法可以让texttrim与ContentPresenter一起工作?

我有隐含的TextBlock和AccessText的样式,有texttrim设置为CharacterEllipsis,但它不是由ContentPresenter捡起。我可以将ContentPresenter更改为AccessText或TextBlock并将其设置在那里,但然后模板只处理文本内容。

有什么建议吗?

谢谢!

WPF: TextTrimming on a ContentPresenter

派生自UIElement而非Control的元素的隐式样式,如果该元素是在控件的模板中定义的,则不会应用该元素的隐式样式,除非该隐式样式是在应用程序的Resources中定义的。这同样适用于ContentPresenter使用的textblock。

例如,在下面的XAML中,最终用于显示按钮内容的TextBlock将而不是获得隐式样式:
<Window.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="Foreground" Value="Red" />
    </Style>
</Window.Resources>
<StackPanel>
    <Button Content="Will not be red" />
    <TextBlock Text="Will be red" />
</StackPanel>

如果你采用完全相同的样式并将其移动到应用程序的资源中,那么两者都将是红色的:

<Application.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="Foreground" Value="Red" />
    </Style>
</Application.Resources>
因此,您可以将隐式样式移动到应用程序资源中,这通常不是一个好主意。或者,您可以针对您拥有的特定场景自定义显示。这可以包括添加一个隐式的DataTemplate,或者自定义控件的Template。
如果你能提供更多的信息,那么就更容易知道哪个是最好的方法。

多亏了James Nugent的这个要点:"WPF风格在按钮内容上放置字符省略号,而不用用TextBlock替换ContentPresenter,从而失去了支持访问键的能力。"

这个为我工作:

<ContentPresenter.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="TextTrimming" Value="CharacterEllipsis"></Setter>    
    </Style>
</ContentPresenter.Resources>