WPF 中 ToolTip 本質為 Object,可包含任何 UIElement。若要實現長文字自動換行,直接在屬性元素中放入 TextBlock 設定 TextWrapping 與 Width 即可:
<TextBlock>
<TextBlock.ToolTip>
<TextBlock Text="很長的文字內容..." TextWrapping="Wrap" />
</TextBlock.ToolTip>
</TextBlock>
為避免重複撰寫,嘗試將 ToolTip 定義移入 Style:
<Style TargetType="TextBlock">
<Setter Property="ToolTipService.ToolTip">
<Setter.Value>
<TextBlock Text="長文字內容" TextWrapping="Wrap" Width="70" />
</Setter.Value>
</Setter>
</Style>
編譯時拋出異常:「無法向 'System.Object' 類型的物件添加 'System.Windows.Controls.TextBlock' 類型的內容。」
將 ToolTip 內容定義為資源,再於 Style 中引用:
<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<!-- 定義 ToolTip 內容為資源 -->
<TextBlock x:Key="ToolTipTemplate"
Text="測試文字內容測試文字內容測試文字內容"
TextWrapping="Wrap" Width="70" />
<Style TargetType="TextBlock">
<Setter Property="ToolTipService.ToolTip" Value="{StaticResource ToolTipTemplate}" />
</Style>
</Page.Resources>
<Grid>
<TextBlock Text="xxx" Width="70" Height="26"/>
</Grid>
</Page>
上述完整 XAML 可直接貼上 XamlPad 驗證效果。關鍵在於繞過 Setter.Value 直接接受 UIElement 的型別限制,改用資源引用機制。
註:為何無法直接在
Setter.Value放置TextBlock仍屬未解之謎,深度分析請參考姊妹篇「[WPF]在Style中設置ToolTip的問題分析」。