2013-01-05 51 views
5

我有下面的代碼:現在WPF工具提示只顯示文本時是什麼

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <Style x:Key="{x:Type ToolTip}" TargetType="{x:Type ToolTip}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ToolTip}"> 
        <Border Background="Black"> 
         <TextBlock FontFamily="Tahoma" FontSize="11" Text="{TemplateBinding Content}" Foreground="WhiteSmoke" Padding="2" /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
<StackPanel> 
    <Label Content="Label 1" ToolTip="asd" /> 
    <Label Content="Label 2" ToolTip="" /> 
    <TextBlock Text="TextBlock 1" ToolTip="asd" /> 
    <TextBlock Text="TextBlock 2" ToolTip="" /> 
    <Button Content="Button 1" ToolTip="asd" /> 
    <Button Content="Button 2" ToolTip="" /> 
</StackPanel> 

,你可以通過測試,當你將鼠標懸停在標籤2,文本塊2,按鍵2見,工具提示仍然顯示。 我希望這被觸發,如果工具提示是空的或null,那麼它不應該顯示任何東西。我知道我可以簡單地從XAML中刪除它但我在這裏做的方式是不同的。

我曾嘗試添加一個觸發檢查值=「」,並設置爲null,內觸發,將模板設置爲空,但他們都不是工作

如果一些您的專家可以在上面一些啓發,我會很高興

回答

6

您可以考慮使用IValueConverter來顯示/隱藏工具提示邊框。這個類添加到項目中:

class BorderVisibilitySetter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //check if the control's content property is null or empty   
     if(value == null || value.ToString() == string.Empty) 
      return Visibility.Collapsed; 
     else 
      return Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

然後修改您的XAML爲:

<src:BorderVisibilitySetter x:Key="BorderVisible" /> 
    <Style x:Key="{x:Type ToolTip}" TargetType="{x:Type ToolTip}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ToolTip}"> 
        <Border Background="Black" Visibility="{TemplateBinding Content, Converter={StaticResource BorderVisible}}" > 
         <TextBlock FontFamily="Tahoma" FontSize="11" Text="{TemplateBinding Content}" Foreground="WhiteSmoke" Padding="2" /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

謝謝!使用下面所示的一點編輯 –

11

A轉換器可能是矯枉過正當DataTrigger可以完成同樣的事情。下面的風格是你發佈的風格,有一些清理和必要的觸發器。請注意以下內容:

  1. 我通常會設置最終將被觸發器覆蓋的默認樣式。在這種情況下,默認樣式爲Visibility=Visible
  2. 有兩個觸發器。一種用於內容爲空時,另一種爲內容爲空時。

XAML

<Style TargetType="ToolTip"> 
    <Setter Property="Visibility" Value="Visible" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ToolTip"> 
       <Border Background="Black"> 
        <TextBlock FontFamily="Tahoma" 
           FontSize="11" 
           Foreground="WhiteSmoke" 
           Padding="2" 
           Text="{TemplateBinding Content}" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Content}" Value="{x:Null}"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Content}" Value=""> 
      <Setter Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

我們可以用觸發器完成同樣的任務是正確的,但是,他嘗試了觸發器並且無法使其工作(在他的文章中閱讀),這就是我使用IValueConverter的原因。 – prthrokz

+0

@prthrokz - OP從未公佈觸發器代碼,所以我們無法驗證代碼。我發佈的觸發器按預期工作,無需轉換器。 –

+0

謝謝@Metro Smurf的解決方案。我錯了地方。首先在此類型中綁定第一個和第二個,Tooltip屬性設置爲Textblock,因此檢查爲空或空無效。所以我修改了上面的代碼,並檢查類型是否只是字符串,如果它是可見的其他可摺疊。 –

0

我的解決方案將有以下特點:如果文本塊有一些文字

  • 提示文本是一樣的文本塊文本

    1. 工具提示會顯示
    2. 工具提示前景與文本塊前景相同

    XAML代碼:

    <TextBlock Name="TxtBlockLicenseInfo" Height="35" ToolTipService.ShowDuration="200000" TextTrimming="CharacterEllipsis"> 
        <TextBlock.ToolTip> 
         <ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}" 
                Visibility="{Binding Text,Converter={StaticResource TextToTooltipVisibilityConverter}}" > 
           <StackPanel> 
             <Label Content="{Binding Text}" Foreground="{Binding Foreground}" > 
             </Label> 
           </StackPanel> 
         </ToolTip> 
         </TextBlock.ToolTip> 
    </TextBlock> 
    

    也包括在XAML資源轉換

    <UserControl.Resources> 
        <local:LicenseInformationToTooltipVisibilityConverter x:Key="LicenseInformationToTooltipVisibilityConverter" /> 
    </UserControl.Resources> 
    

    Xaml.Cs寫代碼轉換器

    public class TextToTooltipVisibilityConverter : IValueConverter 
    { 
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         if ((value.ToString().Equals(string.Empty))) 
         { 
          return Visibility.Collapsed; 
         } 
         else return Visibility.Visible; 
        } 
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         return Visibility.Visible; 
        } 
    }