以下文本块按预期包装和修剪.修剪文本时会显示省略号"...".
我想用全文显示文本上的工具提示,但仅限于文本被修剪.我不确定如何可靠地确定是否显示"...".
如何确定文本是否正在修剪?
因为Alek的答案中的链接已关闭,我找到了一个来自Wayback机器的链接的缓存副本.您无法下载文章中链接的代码,因此这里是代码的预组装版本.在尝试使其工作时遇到了一两个问题,因此这段代码与本文示例中的代码略有不同.
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace TextBlockService { //Based on the project from http://web.archive.org/web/20130316081653/http://tranxcoder.wordpress.com/2008/10/12/customizing-lookful-wpf-controls-take-2/ public static class TextBlockService { static TextBlockService() { // Register for the SizeChanged event on all TextBlocks, even if the event was handled. EventManager.RegisterClassHandler( typeof(TextBlock), FrameworkElement.SizeChangedEvent, new SizeChangedEventHandler(OnTextBlockSizeChanged), true); } private static readonly DependencyPropertyKey IsTextTrimmedKey = DependencyProperty.RegisterAttachedReadOnly("IsTextTrimmed", typeof(bool), typeof(TextBlockService), new PropertyMetadata(false)); public static readonly DependencyProperty IsTextTrimmedProperty = IsTextTrimmedKey.DependencyProperty; [AttachedPropertyBrowsableForType(typeof(TextBlock))] public static Boolean GetIsTextTrimmed(TextBlock target) { return (Boolean)target.GetValue(IsTextTrimmedProperty); } public static readonly DependencyProperty AutomaticToolTipEnabledProperty = DependencyProperty.RegisterAttached( "AutomaticToolTipEnabled", typeof(bool), typeof(TextBlockService), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.Inherits)); [AttachedPropertyBrowsableForType(typeof(DependencyObject))] public static Boolean GetAutomaticToolTipEnabled(DependencyObject element) { if (null == element) { throw new ArgumentNullException("element"); } return (bool)element.GetValue(AutomaticToolTipEnabledProperty); } public static void SetAutomaticToolTipEnabled(DependencyObject element, bool value) { if (null == element) { throw new ArgumentNullException("element"); } element.SetValue(AutomaticToolTipEnabledProperty, value); } private static void OnTextBlockSizeChanged(object sender, SizeChangedEventArgs e) { TriggerTextRecalculation(sender); } private static void TriggerTextRecalculation(object sender) { var textBlock = sender as TextBlock; if (null == textBlock) { return; } if (TextTrimming.None == textBlock.TextTrimming) { textBlock.SetValue(IsTextTrimmedKey, false); } else { //If this function is called before databinding has finished the tooltip will never show. //This invoke defers the calculation of the text trimming till after all current pending databinding //has completed. var isTextTrimmed = textBlock.Dispatcher.Invoke(() => CalculateIsTextTrimmed(textBlock), DispatcherPriority.DataBind); textBlock.SetValue(IsTextTrimmedKey, isTextTrimmed); } } private static bool CalculateIsTextTrimmed(TextBlock textBlock) { if (!textBlock.IsArrangeValid) { return GetIsTextTrimmed(textBlock); } Typeface typeface = new Typeface( textBlock.FontFamily, textBlock.FontStyle, textBlock.FontWeight, textBlock.FontStretch); // FormattedText is used to measure the whole width of the text held up by TextBlock container FormattedText formattedText = new FormattedText( textBlock.Text, System.Threading.Thread.CurrentThread.CurrentCulture, textBlock.FlowDirection, typeface, textBlock.FontSize, textBlock.Foreground); formattedText.MaxTextWidth = textBlock.ActualWidth; // When the maximum text width of the FormattedText instance is set to the actual // width of the textBlock, if the textBlock is being trimmed to fit then the formatted // text will report a larger height than the textBlock. Should work whether the // textBlock is single or multi-line. // The "formattedText.MinWidth > formattedText.MaxTextWidth" check detects if any // single line is too long to fit within the text area, this can only happen if there is a // long span of text with no spaces. return (formattedText.Height > textBlock.ActualHeight || formattedText.MinWidth > formattedText.MaxTextWidth); } } }
我最近没有做过很多WPF,所以我不确定这是不是你想要的,但是看看这篇文章:自定义"看起来"的WPF控件 - 拿2.它有点复杂,但它似乎解决了你所问的同一个问题.更新:网站似乎已经消失,但您可以在存档中找到该文章.