前言 這是我今天在回答SO問題時偶然遇到的,覺得可能還比較通用,就記錄下來以供參考。 通常,我們使用 最簡單的方式是這樣: 這樣在游標懸浮在 上方時,會顯示一個提示條,但是這似乎又違背了一個設計原則: ToolTip作為提示,應該僅在當前內容顯示不全,且用戶有意願查看完整內容時作為替代元素出現 這很 ...
前言
這是我今天在回答SO問題時偶然遇到的,覺得可能還比較通用,就記錄下來以供參考。
通常,我們使用ToolTip
最簡單的方式是這樣:
<TextBlock Text="Test"
ToolTipService.ToolTip="Test"
/>
這樣在游標懸浮在TextBlock
上方時,會顯示一個提示條,但是這似乎又違背了一個設計原則:
ToolTip作為提示,應該僅在當前內容顯示不全,且用戶有意願查看完整內容時作為替代元素出現
這很好理解,如果TextBlock
足以顯示所有文本內容,那麼顯示Tooltip
顯然是多此一舉的事情。但UWP並沒有對這種常見的情況進行自動處理,比如將TextBlock
在文本溢出時自動顯示Tooltip
作為一個預設行為,所以我們就需要自己來實現這個操作。
思路
我能想到的思路是藉助TextBlock.IsTextTrimmed
屬性,在True
的時候設置Tooltip的值為TextBlock.Text
,在False
的時候設置Tooltip
的值為null
。
但在實際創建的時候,我發現這很難做到,原因如下:
- Converter的
ConverterParameter
屬性是一個簡單對象(object),無法通過綁定進行傳值(只有DependencyProperty
才能使用綁定),這意味著我無法在綁定IsTextTrimmed
的同時通過ConverterParameter
屬性傳入Text的值 - 我也不能直接在Converter內綁定
TextBlock
本身,目標太大,而我只想要IsTextTrimmed
屬性改變時進行判斷.
綜上,在查找一些資料後,我決定改造一下Converter
本身。
解決方法
Converter
public class TrimConverter : DependencyObject, IValueConverter
{
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(TrimConverter), new PropertyMetadata(""));
public object Convert(object value, Type targetType, object parameter, string language)
{
bool isTrim = System.Convert.ToBoolean(value);
return isTrim ? Text : null;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
我在Converter內部創建了一個DependencyProperty
用來存放TextBlock.Text
的值。
使用
<Page.Resources>
<local:TrimConverter x:Key="TrimConverter" Text="{Binding ElementName=TestBlock,Path=Text}"/>
</Page.Resources>
...
<TextBlock MaxWidth="100" TextTrimming="CharacterEllipsis"
x:Name="TestBlock"
ToolTipService.ToolTip="{Binding ElementName=TestBlock,
Path=IsTextTrimmed,
Converter={StaticResource TrimConverter}}"/>
在XAML界面中完成綁定後,實測可以解決我的需求。
但是這個解決方法並不完美,它有一個問題:
和TextBlock本身耦合,由於Text值需要綁定,只能一個TextBlock創建一個Converter,不能夠復用
實現在TextBlock文本溢出時顯示Tooltip有多種實現方式,我只提出了一種,以供參考。