1

Silverlight ツールチップ スタイルを作成したいのですが、ツールチップのコンテンツが画像などである可能性があるため、テキストブロックを使用したくありません。だから私は ContentPresenter を使用しています。私の問題は、コンテンツがテキストの場合に MaxWidth を設定して TextWrapping を強制する方法です。これは私がこれまでに持っているものです:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
    xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit">

    <Style TargetType="ToolTip">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToolTip">
                    <Border BorderBrush="DimGray" BorderThickness="1" CornerRadius="5" Background="WhiteSmoke" Opacity="0.8"
                        HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,10,0,-5" Width="Auto">
                        <Border.Effect>
                            <DropShadowEffect BlurRadius="16" ShadowDepth="8" Direction="-45" Color="Black" Opacity="0.6"/>
                        </Border.Effect>
                        <Grid>
                            <ContentPresenter Content="{TemplateBinding Content}" Margin="3"/>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>
4

2 に答える 2

0

これを行う 1 つの方法を見つけました: 2 つのツールチップ スタイルを作成します。1 つはテキスト用、もう 1 つはその他すべて用です。

<Style x:Key="TooltipStyleForText" TargetType="ToolTip">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToolTip">
                <Border BorderBrush="DimGray" BorderThickness="1" CornerRadius="5" Background="WhiteSmoke" Opacity="0.8"
                    HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,10,0,-5" Width="Auto">
                    <Border.Effect>
                        <DropShadowEffect BlurRadius="16" ShadowDepth="8" Direction="-45" Color="Black" Opacity="0.6"/>
                    </Border.Effect>
                    <Grid>
                        <TextBlock Text="{TemplateBinding Content}" MaxWidth="400" TextWrapping="Wrap" Margin="3"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="TooltipStyleForOtherStuffThanText" TargetType="ToolTip">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToolTip">
                <Border BorderBrush="DimGray" BorderThickness="1" CornerRadius="5" Background="WhiteSmoke" Opacity="0.8"
                    HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,10,0,-5" Width="Auto">
                    <Border.Effect>
                        <DropShadowEffect BlurRadius="16" ShadowDepth="8" Direction="-45" Color="Black" Opacity="0.6"/>
                    </Border.Effect>
                    <Grid>
                        <ContentPresenter Content="{TemplateBinding Content}" Margin="3"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

TextBlock を使用する場合よりも、次のように ToolTip スタイルを呼び出します。

<TextBlock Text="something">
    <ToolTipService.ToolTip>
        <ToolTip Style="{StaticResource TooltipStyleForText}">
            <TextBlock Text="Some text"/>
        </ToolTip>
    </ToolTipService.ToolTip>
</TextBlock>

2 つのスタイルがあるため、単純な TextBlock に対して複数行の書き込みを指定する必要があるため、これは最善の解決策ではない可能性があります。誰かがより良い解決策を持っていることを願っています。

于 2012-06-14T14:51:19.587 に答える
0

次の解決策に着手する前に、同じことを行う必要があり、いくつかのアプローチを試しました. 問題は、ToolTip.Content が文字列の場合、TextBlock を使用してツールチップを表示する必要があることです。ToolTip.Content が文字列でない場合、ContentPresenter を使用する必要があります。したがって、両方を持つ ControlTemplate を定義することになり、ToolTip.Content のタイプに基づいて適切なものを表示/非表示にします。このアプローチは、アプリケーション内のすべてのツールチップに適用されます。

次のコンバーター クラスがこれに役立ちます。

public class TooltipContentVisibilityConverter : IValueConverter
{
    public Visibility VisibilityWhenToolTipContentIsAString { get; set; }
    public Visibility VisibilityWhenToolTipContentIsNotAString { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var toolTip = value as ToolTip;
        if (toolTip != null && toolTip.Content is string)
        {
            return VisibilityWhenToolTipContentIsAString;
        }

        return VisibilityWhenToolTipContentIsNotAString;
    }

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

次に、App.xaml で次のように定義します。

<Converter:TooltipContentVisibilityConverter VisibilityWhenToolTipContentIsAString="Visible" VisibilityWhenToolTipContentIsNotAString="Collapsed" x:Key="tooltipStringContentVisibilityConverter" />
<Converter:TooltipContentVisibilityConverter VisibilityWhenToolTipContentIsAString="Collapsed" VisibilityWhenToolTipContentIsNotAString="Visible" x:Key="tooltipNonStringContentVisibilityConverter" />
    <Style TargetType="ToolTip">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ToolTip">
        <Border CornerRadius="0" Background="{TemplateBinding Background}" BorderBrush="Black" BorderThickness="1" Padding="4">
          <StackPanel Orientation="Vertical">
            <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" MaxWidth="300" 
                       Visibility="{Binding RelativeSource={RelativeSource AncestorType=ToolTip},Converter={StaticResource tooltipStringContentVisibilityConverter}}"/>
            <ContentPresenter Content="{TemplateBinding Content}" 
                              Visibility="{Binding RelativeSource={RelativeSource AncestorType=ToolTip},Converter={StaticResource tooltipNonStringContentVisibilityConverter}}"/>
          </StackPanel>
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
    </Style>

この問題を解決しなければならないのは少し厄介な方法のように思えますが、うまくいき、まだより良い解決策を見つけていません.

于 2012-11-07T23:41:06.597 に答える