2013-01-05 27 views
5

tôi đang có đoạn mã sau:WPF Tooltip Chỉ khi Văn bản được phát một cái gì đó

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

Bây giờ, như bạn có thể nhìn thấy bằng cách kiểm tra rằng khi bạn di chuột qua Label 2, TextBlock 2, nút 2 , một chú giải công cụ vẫn hiển thị. Tôi muốn điều đó được kích hoạt nếu Tooltip rỗng hoặc không thì nó sẽ không hiển thị gì cả. Tôi biết tôi có thể chỉ đơn giản là loại bỏ rằng từ XAML Nhưng cách tôi đang làm ở đây là một cái gì đó khác nhau.

Tôi đã thử thêm một kích hoạt để kiểm tra giá trị = "" và null và bên trong kích hoạt, thiết lập mẫu để null nhưng không ai trong số họ đang làm việc

Nếu một số bạn chuyên gia có thể làm sáng tỏ về nó, tôi sẽ rất vui mừng

Trả lời

6

Bạn có thể xem xét sử dụng một IValueConverter để hiển thị/ẩn đường viền chú giải công cụ. Thêm lớp này để dự án của bạn:

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(); 
    } 
} 

Sau đó chỉnh sửa XAML của bạn như:

<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

Cảm ơn bạn ! Chúng tôi đã làm việc với một chút chỉnh sửa được nêu bên dưới –

11

Một chuyển đổi có lẽ là quá mức cần thiết khi một DataTrigger có thể thực hiện điều tương tự. Phong cách sau đây là phong cách được đăng của bạn, với một chút dọn dẹp và các kích hoạt cần thiết. Lưu ý những điều sau:

  1. Tôi thường đặt kiểu mặc định cuối cùng sẽ bị ghi đè bởi trình kích hoạt. Trong trường hợp này, kiểu mặc định là Visibility=Visible.
  2. Có hai trình kích hoạt. Một cho khi nội dung là null và cái kia khi nội dung rỗng.

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

Chính xác là chúng tôi có thể thực hiện cùng một tác vụ với trình kích hoạt, tuy nhiên, anh ấy đã thử kích hoạt và không thể làm cho nó hoạt động (như đã đọc trong bài đăng của anh ấy), đó là lý do tôi sử dụng IValueConverter. – prthrokz

+0

@prthrokz - OP không bao giờ đăng mã kích hoạt, vì vậy chúng tôi không thể xác thực mã. Trình kích hoạt tôi đã đăng hoạt động như mong đợi mà không cần đến trình chuyển đổi. –

+0

Cảm ơn bạn @Metro Smurf cho giải pháp của bạn. Tôi đã sai ở những nơi. Đầu tiên là ràng buộc một và thứ hai trong loại này, thuộc tính Tooltip được đặt thành một Textblock để kiểm tra null hoặc rỗng không hoạt động. Vì vậy, tôi sửa đổi mã trên và kiểm tra xem loại là chuỗi chỉ, nếu nó là trả lại Hiển thị khác sụp đổ. –

0

Giải pháp của tôi sẽ có dưới đây các tính năng:

  1. Tooltip sẽ được hiển thị nếu TextBlock có một số văn bản
  2. Tooltip văn bản là giống như văn bản TextBlock
  3. Mặt trước của Tooltip giống như textblock foreground

XAML Code:

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

Cũng bao gồm bộ chuyển đổi trong các nguồn XAML

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

Xaml.Cs Mã để viết bộ chuyển đổi

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; 
    } 
} 
Các vấn đề liên quan