22

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

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

ToolTipService.InitialShowDelay="2000"

对于每个具有工具提示的控件?或者是否有某种方法可以全局设置此属性,使用样式之类的东西?

感谢您的任何想法。

4

4 回答 4

32

不幸的是,没有简单的方法可以做到这一点。理想情况下,您应该在 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>

等等

虽然这是一种非常冗长的方法,但至少您只需在每种类型的控件上设置它,而不是每个控件本身 - 如果您在功能区中使用它,那么只有少数控件可以开始和。

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

<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}"/>

这种方法的限制是一个样式只能基于一个父样式,所以如果你已经在使用这个模式,你将无法做到这一点。

于 2009-06-04T21:38:05.623 回答
16

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

它们都基于 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>

这将对整个窗口或您应用该属性的任何其他元素起到作用。

高温高压

于 2009-10-26T05:59:29.897 回答
9

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

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

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

于 2011-01-24T13:11:41.140 回答
3

Nicholas Armstrong 的解决方案非常好,但是如果您将 ToolTipService.IsEnabled 设置为 true,则设置 FrameworkElement 的样式会起作用。

在我的项目中,我为每个字段设置了通用样式并设置了 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>
于 2014-07-11T11:49:03.933 回答