全局更改ToolTip InitialShowDelay属性

时间:2009-06-04 20:40:03

标签: c# wpf xaml tooltip

我有一个应用程序,在Ribbon控件上设置了超过一百个不同的工具提示。所有的工具提示都会很快弹出(大约半秒钟),我想增加弹出延迟。经过一些研究后,似乎在WPF中执行此操作的唯一方法是通过ToolTipService.InitialShowDelay属性。

我的问题是,我是否必须通过XAML并明确说出

ToolTipService.InitialShowDelay="2000"

对于每个具有ToolTip的控件?或者是否有某种方法可以使用类似Style?

的方式全局设置此属性

感谢任何想法。

4 个答案:

答案 0 :(得分:25)

不幸的是,没有简单的方法可以做到这一点。理想情况下,你在FrameworkElement上设置ToolTipService.InitialShowDelay并让它从那里传播,但结果似乎不起作用。

相反,您可以在要设置它的每个类型控件上设置它,例如:

<Style TargetType="RibbonButton">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>
<Style TargetType="RibbonToggleButton">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>
<Style TargetType="RibbonDropDownButton">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>

虽然这是一种非常冗长的方式,但至少你只需要在每种类型的控件上设置它而不是每个控件本身 - 如果你在Ribbon中使用它,那么只有少数几个控制开始。

如果您想要更改值,为了省去一些麻烦,您可能希望使用资源值来构建上述代码:

<sys:Int32 x:Key="ToolTipInitialShowDelay">2000</sys:Int32>
<Style TargetType="RibbonButton">
    <Setter Property="ToolTipService.InitialShowDelay" 
            Value="{StaticResource ToolTipInitialShowDelay}"/>
</Style>
<Style TargetType="RibbonToggleButton">
    <Setter Property="ToolTipService.InitialShowDelay" 
            Value="{StaticResource ToolTipInitialShowDelay}"/>
</Style>
<Style TargetType="RibbonDropDownButton">
    <Setter Property="ToolTipService.InitialShowDelay" 
            Value="{StaticResource ToolTipInitialShowDelay}"/>
</Style>

或者,如果您尚未使用BasedOn样式,则可以将其缩短为:

<Style x:Key="ToolTipDefaults">
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/>
</Style>
<Style TargetType="RibbonButton" BasedOn="{StaticResource ToolTipDefaults}"/>
<Style TargetType="RibbonToggleButton" BasedOn="{StaticResource ToolTipDefaults}"/>
<Style TargetType="RibbonDropDownButton" BasedOn="{StaticResource ToolTipDefaults}"/>

此方法的局限性在于样式只能基于一种父样式,因此如果您已经使用此模式,则无法执行此操作。

答案 1 :(得分:12)

我遇到了同样的问题并取得了明显的解决方案。其中两个,实际上。

它们都基于DependencyProperty元数据系统。对于它们两者,您将需要一些非常相似的静态初始化代码:

public static class ToolTipServiceHelper
{
    static ToolTipServiceHelper()
    {
        ToolTipService.InitialShowDelayProperty
            .OverrideMetadata(typeof(FrameworkElement), 
                              new FrameworkPropertyMetadata(...));
    }
}

什么不是“......”?

第一个解决方案非常明显:在那里放置所需的默认值,该值将应用于整个应用程序,但提供实际值的地方除外。

第二个解决方案是棘手的:而不是“...”,您提供默认元数据的默认值,但除此之外您更改选项,实际上您必须使属性可继承。

new FrameworkPropertyMetadata(
    ToolTipService.InitialShowDelayProperty.DefaultMetadata.DefaultValue,
    FrameworkPropertyMetadataOptions.Inherits)

当属性可以继承时,你可以做这样的事情:

<Window xmlns="..."
        ...
        ToolTipService.InitialShowDelay="2000">
    ...
</Window>

这将为整个窗口或您应用该属性的任何其他元素提供技巧。

HTH

答案 2 :(得分:8)

我喜欢archimed7592的解决方案,但它不会自行运行。你需要以某种方式使用类来运行它的静态构造函数。所以我选择将此代码放入我的应用程序Application类的静态构造函数中,如下所示:

    static NetFriendApplication()
    {
        ToolTipService.ShowDurationProperty.OverrideMetadata(
            typeof (FrameworkElement), new FrameworkPropertyMetadata(int.MaxValue));
    }

在我的情况下,我需要设置另一个属性,但想法是一样的。所以不要好奇。

答案 3 :(得分:3)

Nicholas Armstrong的解决方案非常好,但如果将ToolTipService.IsEnabled设置为true,那么样式化FrameworkElement就可以了。

在我的项目中,我对每个字段都有一个commom样式,并设置ToolTip.InitialDelay,这是合理的事情,它没有工作,所以我尝试了ToolTip.IsEnabled并且它工作了

以下示例:

<Style x:Key="FieldStyle" TargetType="FrameworkElement">
    <Setter Property="ToolTipService.ShowOnDisabled" Value="True"/>
    <Setter Property="ToolTipService.ShowDuration" Value="20000"/>
    <Setter Property="ToolTipService.InitialShowDelay" Value="3000"/>
    <Setter Property="ToolTipService.IsEnabled" Value="True"/>
</Style>