我有一个应用程序,它在功能区控件上设置了上百个不同的工具提示。所有的工具提示都弹出得相当快(大约半秒),我想增加弹出延迟。经过一些研究,似乎在 WPF 中执行此操作的唯一方法是通过 ToolTipService.InitialShowDelay 属性。
我的问题是,我是否必须通过 XAML 并明确说
ToolTipService.InitialShowDelay="2000"
对于每个具有工具提示的控件?或者是否有某种方法可以全局设置此属性,使用样式之类的东西?
感谢您的任何想法。
不幸的是,没有简单的方法可以做到这一点。理想情况下,您应该在 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}"/>
这种方法的限制是一个样式只能基于一个父样式,所以如果你已经在使用这个模式,你将无法做到这一点。
我遇到了同样的问题并取得了可观的解决方案。其中两个,实际上。
它们都基于 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>
这将对整个窗口或您应用该属性的任何其他元素起到作用。
高温高压
我喜欢 archimed7592 的解决方案,但它不会自行运行。您需要以某种方式使用类来运行它的静态构造函数。所以我选择将此代码放入我的应用程序 Application 类的静态构造函数中,如下所示:
static NetFriendApplication()
{
ToolTipService.ShowDurationProperty.OverrideMetadata(
typeof (FrameworkElement), new FrameworkPropertyMetadata(int.MaxValue));
}
在我的情况下,我需要设置另一个属性,但想法是一样的。所以不要好奇。
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>