大家可能在項目中,有的時候,由於顯示的內容過長,所以,需要顯示一部分內容,然後後面用省略號,把滑鼠放上去,會顯示出來全部的內容。 作為一個LowB程式員的我,第一反應是SubString截取,然後替換,然後ToolTip顯示原有的內容。 我相信很大一部分的初級程式員第一想法也是這個,然而,這種方法不 ...
大家可能在項目中,有的時候,由於顯示的內容過長,所以,需要顯示一部分內容,然後後面用省略號,把滑鼠放上去,會顯示出來全部的內容。
作為一個LowB程式員的我,第一反應是SubString截取,然後替換,然後ToolTip顯示原有的內容。
我相信很大一部分的初級程式員第一想法也是這個,然而,這種方法不具有一個通用型,當然,有的童鞋可能說,寫個函數,然後設置傳遞的參數,這樣不就可以了嗎?
事實上,這樣也是很不方便的。
本文的重點來了:
昨天在項目里發現了同事寫的一個很棒的附加屬性,今天把它共用出來,供大家學習。
在此,先感謝那位同事,雖然不知道誰寫的(沒有備註),但是真的很棒。
代碼不難,但是效果確實不錯,先看下效果。
由於是一個可變的長度,所以,不是用傳統的一個截取的方法,而是根據TextBlock外部的寬度,自動實現的截取效果,而且感覺系統的這種,還挺有意思。
可以看到第一行,前面是文字,後面是數字“我是測試長度1111111111111111111111111”,直接從數字部分往後,都用了省略號,而不是必須到了最外層的邊緣才進行的截取。
第二行,由於後面是文字,到了最外層的寬度,才用省略號進行了替換。
代碼如下:
public class TextBlockToolTip { public static bool GetAutoTooltip(DependencyObject obj) { return (bool)obj.GetValue(AutoTooltipProperty); } public static void SetAutoTooltip(DependencyObject obj, bool value) { obj.SetValue(AutoTooltipProperty, value); } // Using a DependencyProperty as the backing store for AutoTooltip. This enables animation, styling, binding, etc... public static readonly DependencyProperty AutoTooltipProperty = DependencyProperty.RegisterAttached("AutoTooltip", typeof(bool), typeof(TextBlockToolTip), new PropertyMetadata(false,OnAutoTooltipPropertyChanged)); private static void OnAutoTooltipPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { TextBlock textBlock = d as TextBlock; if (textBlock == null) return; if (e.NewValue.Equals(true)) { textBlock.TextTrimming = TextTrimming.WordEllipsis; ComputeAutoTooltip(textBlock); textBlock.SizeChanged += TextBlock_SizeChanged; } else { textBlock.SizeChanged -= TextBlock_SizeChanged; } } private static void TextBlock_SizeChanged(object sender, SizeChangedEventArgs e) { TextBlock textBlock = sender as TextBlock; ComputeAutoTooltip(textBlock); } private static void ComputeAutoTooltip(TextBlock textBlock) { textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); var width = textBlock.DesiredSize.Width; if (textBlock.ActualWidth<width) { ToolTipService.SetToolTip(textBlock, textBlock.Text); } else { ToolTipService.SetToolTip(textBlock, null); } } }
測試代碼如下:
就是把附加屬性AutoToolTip設置為True就可以了。
希望這個附加屬性可以對你們有所幫助。