WPF--TextBlock的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就可以了。

希望這個附加屬性可以對你們有所幫助。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM