WPF:在ContentPresenter上应用TextTrimming

10

有没有一种简单的方法来让TextTrimming在ContentPresenter中起作用?

我对TextBlock和AccessText设置了隐式样式,将TextTrimming设置为CharacterEllipsis,但ContentPresenter没有使用这些样式。我可以将ContentPresenter更改为AccessText或TextBlock并在那里设置它,但是那样模板只处理文本内容。

有什么建议吗?

谢谢!

2个回答

13

如果 UIElement 派生的元素不是 Control,且该元素在控件模板中定义,则不会应用隐式样式,除非 隐式样式在应用程序资源中定义。对于 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。

如果你能提供更多信息,那么就更容易知道哪种方法最好。


3
@H.B. - 我把城市染红了! - CodeNaked
1
谢谢您的解释!其他地方发布的另一种解决方案是在ControlTemplate中的ContentPresenter.Resources中定义样式。我尝试了这种方法,它有效。在我们的情况下,将隐式样式移动到Application.Resources中可以工作,因为所有的文本块都应该被修剪。添加一个隐式数据模板是否类似于我上面所做的?如何定义数据模板以支持任意内容? - dex3703
@dex3703 - 你不能拥有一个“全局”的隐式DataTemplate。你必须针对你要显示的具体类型进行目标定位,例如String或任何你可能拥有的自定义类。隐式DataTemplate在你不想重新定义ControlTemplate(只是为了添加TextTrimming)的情况下非常有用。但是,隐式DataTemplate不适用于任意内容。 - CodeNaked
为什么添加TextTrimming或TextWrapping很困难? - dex3703
@dex3703 - 总的来说,您不会希望将文本修剪/换行应用于所有TextBlocks。例如,在大多数情况下,在按钮中并没有太多意义。这就是为什么隐式样式不会被应用,除非它们在App资源中(或者模板中显式指定)。但是,有太多的属性要通过父元素公开,以至于无法公开它们所有。但是回答您的问题,可能是可以的,但我不确定为什么 :-) - CodeNaked
显示剩余2条评论

9
感谢James Nugent的这个代码片段(Gist),它提供了一种WPF样式,可以在不替换ContentPresenter为TextBlock的情况下,在按钮内容上放置字符省略号,从而不会失去支持访问键的能力。
这对我很有效:
<ContentPresenter.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="TextTrimming" Value="CharacterEllipsis"></Setter>    
    </Style>
</ContentPresenter.Resources>

这是一个非常聪明的解决方案。它运行得非常好。谢谢你的分享! - ai_enabled
重写样式表是我处理这类事情的首选方式! - James McDuffie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接