WPF ToolTip初始显示延迟设置未生效,求助排查问题
解决WPF ToolTip延迟设置不生效的问题
我帮你分析下为啥你的ToolTip延迟设置没起作用,核心问题是你的ToolTipServiceHelper类的静态构造函数根本没被执行!
WPF里静态类的静态构造函数只有在类被首次访问时才会运行,你现在只是创建了这个类,但没有任何代码触发它的加载,所以OverrideMetadata那行代码压根没执行,InitialShowDelay属性的继承性也就没被启用——这就导致你在UserControl上设置的延迟值无法传递给Button,Button还是用默认的初始延迟(所以看起来几乎立即显示)。
给你几个可行的解决方案,选一个适合你的就行:
方案一:强制加载ToolTipServiceHelper类
在应用启动的地方(比如App.xaml.cs的构造函数)加一行代码,触发类的加载,让静态构造函数跑起来:
public partial class App : Application { public App() { // 强制访问ToolTipServiceHelper类,触发静态构造 _ = typeof(My_proj.Utils.ToolTipServiceHelper); } }
这样InitialShowDelay的继承性就会生效,你在UserControl上设置的2000毫秒延迟会传递给所有子元素的ToolTip。
方案二:直接给Button设置延迟属性
如果不想折腾继承的事儿,最简单的办法就是直接在Button上加上ToolTipService.InitialShowDelay属性,跳过Helper类:
<Button Grid.Row="0" ToolTip="{x:Static res:Resources.tooltip_add_clip_s_for_processing}" x:Name="Btn_path_to_clip_folder" Click="Btn_path_to_clip_folder_Click" Content="{x:Static res:Resources.add_dots}" Cursor="Hand" Margin="4" HorizontalAlignment="Stretch" ToolTipService.InitialShowDelay="2000"/>
这样设置后,这个Button的ToolTip就会在悬停2秒后显示。
方案三:修改Helper类设置全局默认延迟
如果你想让整个应用的所有ToolTip都默认用2000毫秒延迟,可以修改Helper类的代码,把默认值直接改成2000,这样只要类被加载,所有FrameworkElement的ToolTip都会生效:
namespace My_proj.Utils { public static class ToolTipServiceHelper { static ToolTipServiceHelper() => ToolTipService.InitialShowDelayProperty .OverrideMetadata( typeof(FrameworkElement), new FrameworkPropertyMetadata(2000, FrameworkPropertyMetadataOptions.Inherits)); } }
记得同样要按方案一的方式触发类的加载哦。
内容的提问来源于stack exchange,提问作者Sirop4ik
相关产品推荐
相关产品推荐

