WPF:ContentPresenter 上的 TextTrimming

Posted

技术标签:

【中文标题】WPF:ContentPresenter 上的 TextTrimming【英文标题】:WPF: TextTrimming on a ContentPresenter 【发布时间】:2011-08-14 05:34:55 【问题描述】:

有没有一种简单的方法可以让 TextTrimming 与 ContentPresenter 一起工作?

我有 TextBlock 和 AccessText 的隐含样式,它们的 TextTrimming 设置为 CharacterEllipsis,但 ContentPresenter 没有拾取它。我可以将 ContentPresenter 更改为 AccessText 或 TextBlock 并将其设置在那里,但模板仅处理文本内容。

有什么建议吗?

谢谢!

【问题讨论】:

【参考方案1】:

感谢this Gist by James Nugent:“WPF 样式将字符省略号放在按钮内容上,而不用 TextBlock 替换 ContentPresenter,因此失去了支持访问键的能力。”

这对我有用:

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

【讨论】:

这是一个非常聪明的解决方案。它工作得很好。谢谢分享! 覆盖样式是我处理这类事情的首选方式!【参考方案2】:

如果元素是在控件的模板中定义的,则不会应用从 UIElement 而不是 Control 派生的元素的隐式样式除非隐式样式是在应用程序资源中定义的。 ContentPresenter 使用的 TextBlocks 也是如此。

例如,在以下 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,或自定义控件的模板。

如果您可以提供更多信息,那么更容易知道哪种方法是最好的。

【讨论】:

@H.B. - 我把小镇涂成红色! 感谢您的解释!在其他地方发布的另一个解决方案在 ControlTemplate 内的 ContentPresenter.Resources 中定义了一种样式。我尝试了这种方法并且它有效。在我们的例子中,将隐式样式移动到 Application.Resources 将起作用,因为所有文本块都应该修剪。是否添加类似于我上面所做的隐式数据模板?如何定义数据模板以便支持任意内容? @dex3703 - 您不能拥有“全局”隐式 DataTemplate。您必须针对您正在显示的特定类型,即字符串或您可能拥有的任何自定义类。隐式 DataTemple 对于您不想重新定义 ControlTemplate(只是添加 TextTrimming)的情况很有用。但同样,隐式 DataTemplate 不适用于任意内容。 添加文本修剪或文本换行这么难有什么原因吗? @dex3703 - 好吧,一般来说,您不希望对所有 TextBlock 应用文本修剪/换行。例如,它在按钮中没有意义(在大多数情况下)。这就是为什么不应用隐式样式的原因,除非它们在 App 资源(或显然是模板)中。但是有太多的属性无法由父元素全部公开。但是可能要回答你的问题,但我不确定为什么:-)

以上是关于WPF:ContentPresenter 上的 TextTrimming的主要内容,如果未能解决你的问题,请参考以下文章

WPF:ContentPresenter 根据样式的位置意外更改前景

WPF WindowChrome ContentPresenter 不显示内容

ContentPresenter理解

为啥 WPF 绑定在绑定到元素本身的标签时不起作用

WPF LinkButton

找不到WPF绑定属性