Both WPF and Silverlight have a property TextTrimming="WordEllipsis", which trims the text that a TextBlock displays based on the available width. This blog post describes a simple method for automatically showing the full text as a tooltip whenever the text is trimmed. This is presented as an attached behaviour and works in both WPF and Silverlight
A few weeks ago I blogged about a Silverlight solution for automatically adding tooltips when a TextBlock Text is trimmed and renders an ellipsis. I found a decent looking WPF solutions on the web and linked it in my article, however, based on the comments to my previous blog post, it looks like the WPF solution didn't work too well, failing to respect font size etc... In this blog post I have updated my solution to be cross-platform, working on WPF and Silverlight.
To briefly recap, my solution for automatically adding tooltips to trimmed text relies on the slightly odd behaviour of the
TextBlock where its
ActualWidth is reported as the width of the text without trimming:
In order to determine whether to show a tooltip, all you have to do is compare the
ActualWidth of the
TextBlock to the
ActualWidth of its parent.
However, the WPF
TextBlock does not have this same quirky behaviour, so a completely different approach is required. The other solutions I have seen involve using the low-level WPF drawing APIs to compute the size of the rendered text, however, there is a simpler solution to this problem ...
UPDATE: I originally wrote about a method of finding the overall text width from various internal fields within the
TextBlock via reflection, as shown below. However, a kind reader of my blog, Daniel Fihnn, pointed out that there is a simpler solution that does not require any reflection.
Daniel pointed out that the width of the TextBlock without the trimming can be obtained using the
Measure method. This method is typically used by panels during layout, the
Measure method is invoked with the size made available to the element, calling this method causes the element to update its
DesiredSize property. Therefore, if you invoke
Measure on a
TextBlock which has trimming enabled, giving it an infinite available space, its
DesiredSize property will report the width that the text would occupy without trimming.
ComputeAutoTooltip method of the attached behaviour I described in my previous post is updated to have a completely different WPF implementation:
This code now works in both a WPF and a Silverlight context. Here's a screenshot of it working in WPF:
You can download the full sourcecode, including the WPF and Silverlight demo: AutoTooltipTextBlock.zip
Thanks to Daniel Fihnn for a much improved WPF version of this code!
Regards, Colin E.