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就可以了。
希望這個附加屬性可以對你們有所幫助。
※MySQL日期、時間相關內容
※goroutine 加 channel 代替遞歸調用,突破遞歸調用的層級限制
※設計模式解密(17)- 備忘錄模式
※php nginx反向代理
※log4go的日誌滾動處理——適應生產環境的需要
TAG:達人科技 |
※Talking Data做的高附加值數據買賣究竟是什麼?
※軟體平台與SaaS模式行不通了,Talking Data做的高附加值數據買賣究竟是什麼?
※價格杠杠的,LOMO發布新款Naiad 15mm附加鏡頭組件
※蘋果新專利曝光 或可附加為iPad/Mac鍵盤
※隱私搜索引擎 DuckDuckGo 發布附加元件和 App,網站隱私等級一覽無遺
※隱私搜索引擎 DuckDuckGo 發布附加元件和 App,幫你防止隱私泄漏
※Zortrax為其3D印表機推出新型附加空氣過濾器
※Firefox 64 附加組件更新 可直接移除擴展
※走陸運的歐洲賣家注意!9至12月,DHL Freight 將開收4%的旺季附加費
※蘋果ios11.3增j加了AR技術,附加四個新的動畫模型
※Varjo推出AR頭顯附加組件支持95度視場角
※比超級明星還強,YouTube網紅給品牌帶來的附加值有多大?
※8月13-19日Xbox金會員+樂高+DLC附加內容主題促銷 含《古墓麗影暗影》《GTA5》《非常英雄》
※CEBIT福伊特數字解決方案帶來附加價值
※追悼Johnny喜多川 電影版《少年們》上映 並附加現場演出影像
※特斯拉Model 3不止發貨了 還附加自動泊車這一驚喜
※華為P30Pro實體店預定記錄:附加50倍變焦現場測試
※上半年強生擠走GSK進全球葯企TOP5 民間投資醫療附加條件將減少
※瑞典、德國VAT爆發,有賣家居然可以「豁免」不繳VAT和清關附加費
※eBay要對不合格賣家加收4%成交附加費!它是這樣回應的