1

类似,但更复杂。

我需要使用有关此控件的其他信息来覆盖所有工具提示(以及所有可以拥有但现在没有的控件)。我想放一些类似的东西

sender.ToolTip =+ "\n\r" + sender.Name + "(" + sender.Tag + ")";

但谷歌了一下,没有成功。


更新

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.ToolTipOpeningEvent, new RoutedEventHandler((s, e2) =>
        {
            var fe = s as FrameworkElement;
            fe.ToolTip = fe.ToolTip + "\n\r(" + fe.Name + ")";
            //fe.Name + " " + fe.Tag;
        }));

        new MainWindow();
    }

几乎可以工作,但是:

  • 对于没有定义工具提示的组件,没有可见的工具提示
  • 对于定义了工具提示的组件,它会在每个显示工具提示事件上增加价值
  • 我不得不将 (s, e) 重命名为 (s, e2) 因为 e 已经定义


更新消除了空异常并防止重复条目

            EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.ToolTipOpeningEvent, new RoutedEventHandler((s, e2) =>
        {
            var fe = (FrameworkElement)s;

            //skip already updated tooltips
            if (fe.ToolTip.ToString().Contains(fe.Name)) return;

            //update tooltip value
            fe.ToolTip = (fe.ToolTip + Environment.NewLine + "(" + ( fe.Tag != null 
                ? string.Join(": ", fe.Name, fe.Tag) 
                : fe.Name
            ) +  ")").Trim();
        }));

仍然不知道如何在没有工具提示的情况下覆盖组件-也许我可以将“”工具提示分配给所有按钮和其他类型的控件,而不是更新已配置的控件?

谢谢

4

1 回答 1

2

切斯克!

您可以使用 WPF 中可用的路由事件基础结构来执行此操作。

像这样调用EventManager.RegisterClassHandler方法:

EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.ToolTipOpeningEvent, new RoutedEventHandler((s, e) =>
            {
                var fe = s as FrameworkElement;
                fe.ToolTip = fe.Name + " " + fe.Tag;                
            }));

您可以将此代码添加到构造函数下的 App.xaml.cs 中:

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 
    <code goes here> 
}
于 2012-12-21T12:47:08.137 回答