5

私は次のコードを持っています:

<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にして、テンプレートをnullに設定しようとしましたが、いずれも機能していません

専門家の何人かがそれに光を当てることができれば、私はとてもうれしいです

4

3 に答える 3

13

DataTriggerが同じことを実行できる場合、コンバーターはおそらくやり過ぎです。次のスタイルは投稿されたスタイルで、少しクリーンアップと必要なトリガーがあります。次の点に注意してください。

  1. 私は通常、トリガーによって最終的にオーバーライドされるデフォルトのスタイルを設定します。この場合、デフォルトのスタイルはVisibility=Visibleです。
  2. 2つのトリガーがあります。1つはコンテンツがnullの場合、もう1つはコンテンツが空の場合です。

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>
于 2013-01-05T18:10:13.450 に答える
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>
于 2013-01-05T15:16:02.103 に答える
0

私のソリューションには以下の機能があります。

  1. textblockにテキストがある場合、ツールチップが表示されます
  2. ツールチップテキストはテキストブロックテキストと同じです
  3. ツールチップの前景はテキストブロックの前景と同じです

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;
    }
}
于 2016-12-09T09:46:34.077 に答える