首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

[WPF] Style 設定 ToolTip 自動換行寬度問題與替代方案

     編輯:關於.NET

WPF 中 ToolTip 本質為 Object,可包含任何 UIElement。若要實現長文字自動換行,直接在屬性元素中放入 TextBlock 設定 TextWrapping 與 Width 即可:

<TextBlock>
  <TextBlock.ToolTip>
    <TextBlock Text="很長的文字內容..." TextWrapping="Wrap" />
  </TextBlock.ToolTip>
</TextBlock>

嘗試移入 Style 時的問題

為避免重複撰寫,嘗試將 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' 類型的內容。」

替代解決方案:StaticResource 間接引用

將 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>

可直接複製到 XamlPad 測試

上述完整 XAML 可直接貼上 XamlPad 驗證效果。關鍵在於繞過 Setter.Value 直接接受 UIElement 的型別限制,改用資源引用機制。

註:為何無法直接在 Setter.Value 放置 TextBlock 仍屬未解之謎,深度分析請參考姊妹篇「[WPF]在Style中設置ToolTip的問題分析」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved