【问题标题】:Custom ToolTip template for some elements某些元素的自定义工具提示模板
【发布时间】:2014-11-15 21:30:23
【问题描述】:

我想设置自定义工具提示样式,但仅适用于某些类型的控件。我有一个自定义控件,它设置工具提示的颜色取决于绑定的消息类型。

如果为“工具提示”设置样式,所有工具提示都显示没有边框,但我只想为我的自定义控件设置。

<Style x:Key="{x:Type ToolTip}" TargetType="ToolTip">
    <Setter Property="OverridesDefaultStyle" Value="true" />
    <Setter Property="HasDropShadow" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToolTip">
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这是我想要的外观和感觉 http://i.imgur.com/fG1aCso.png

“普通工具提示”必须在鼠标悬停在按钮上时显示,“信息工具提示”在带有蓝色文本的自定义控件上时显示,等等

FTI:我尝试将样式放在 DLL(定义自定义控件的位置)上,但不起作用。我的“assembly.info”上有下一个代码,因此它采用了“Themes/Generic.xaml”中的模板

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
    //(used if a resource is not found in the page, 
    // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries)
)]

【问题讨论】:

  • TargetType更改为您的自定义控件,然后将属性ToolTip设置为这种样式?
  • 如果我更改目标类型,系统会抛出异常。 TargetType 与 System.ArgumentException 不匹配。

标签: c# wpf tooltip


【解决方案1】:

按照您当前的方法,您可以尝试使用一些DataTrigger 监听PlacementTarget 来检查其类型并相应地设置Template。所以我们在这里需要一个转换器(将PlacementTarget 转换为其类型)。这是工作代码:

<Style TargetType="ToolTip">
   <Style.Resources>
      <local:ElementToTypeConverter x:Key="typeConverter"/>
   </Style.Resources>
   <Style.Triggers>
       <DataTrigger Binding="{Binding PlacementTarget, 
                              RelativeSource={RelativeSource Self},
                              Converter={StaticResource typeConverter}}" 
                    Value="{x:Type Button}">
           <Setter Property="Template">
              <Setter.Value>
                 <ControlTemplate TargetType="ToolTip">
                    <Border BorderBrush="Red" BorderThickness="2">
                      <ContentPresenter/>
                    </Border>
                 </ControlTemplate>
              </Setter.Value>
           </Setter>
       </DataTrigger>
       <DataTrigger Binding="{Binding PlacementTarget, 
                              RelativeSource={RelativeSource Self},
                              Converter={StaticResource typeConverter}}" 
                    Value="{x:Type ToggleButton}">
           <Setter Property="Template">
              <Setter.Value>
                 <ControlTemplate TargetType="ToolTip">
                    <Border BorderBrush="Blue" BorderThickness="1">
                       <ContentPresenter/>
                    </Border>
                 </ControlTemplate>
              </Setter.Value>
           </Setter>
       </DataTrigger>
   </Style.Triggers>
</Style>

代码隐藏

public class ElementToTypeConverter : IValueConverter
{

    object IValueConverter.Convert(object value, Type targetType, 
                    object parameter, System.Globalization.CultureInfo culture)
    {
        return value == null ? Type.Missing : value.GetType();
    }

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

以上只是应用于两种控件类型的示例:ButtonToggleButton,您可以将它们替换为您自己的控件类型并将工具提示的模板更改为您想要的任何内容。

【讨论】:

  • 我希望在控件库中使用此功能。您的代码仅在我放入应用程序的 app.xaml 而不是库的 xaml 时才有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多