【问题标题】:Change the ToolTip InitialShowDelay Property Globally全局更改 ToolTip InitialShowDelay 属性
【发布时间】:2009-06-04 20:40:02
【问题描述】:

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

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

ToolTipService.InitialShowDelay="2000"

对于每个具有工具提示的控件?或者有什么方法可以全局设置这个属性,使用 Style 之类的东西?

感谢您的任何想法。

【问题讨论】:

    标签: c# wpf xaml tooltip


    【解决方案1】:

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

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

    【讨论】:

    • 对我来说正好相反 - 你的第二个代码不起作用,但第一个代码起作用。
    • 它对我不起作用。我的 标记导致此错误 XDG0012 成员“InitialShowDelay”无法识别或无法访问。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        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>
        

        【讨论】:

        • 我正在寻找这样的解决方案(仅限样式),但不必将 FieldStyle 键分配给元素。
        猜你喜欢
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        相关资源
        最近更新 更多