C# 是否可以更改ToolStripMenuItem工具提示字体?

C# 是否可以更改ToolStripMenuItem工具提示字体?,c#,.net,winforms,tooltip,toolstrip,C#,.net,Winforms,Tooltip,Toolstrip,我有一个动态填充的ContextMenuItem,其中每个ToolStripMenuItem都有一个用于工具提示的格式化文本。而且,为了让这个文本对用户有意义,我必须使用单间距字体,比如“Courier New”。默认字体是常规的非等距字体。 我找不到工具提示对象的任何getter,也找不到覆盖其绘制事件的方法,也找不到设置其样式的方法 那么,是否有可能更改ToolStripMenuItem的工具提示字体 实现从ToolTip继承的CustomToolTip并不能解决将新工具提示传递给ToolS

我有一个动态填充的ContextMenuItem,其中每个ToolStripMenuItem都有一个用于工具提示的格式化文本。而且,为了让这个文本对用户有意义,我必须使用单间距字体,比如“Courier New”。默认字体是常规的非等距字体。 我找不到工具提示对象的任何getter,也找不到覆盖其绘制事件的方法,也找不到设置其样式的方法

那么,是否有可能更改ToolStripMenuItem的工具提示字体


实现从ToolTip继承的CustomToolTip并不能解决将新工具提示传递给ToolStripMenuItem的问题。

您可以创建从ToolTip继承的自定义工具提示类(CustomToolTip)。然后您必须处理OnDraw事件。在该事件中,您可以更改字体

例如(有一个vb和c的例子)

编辑


您必须自己处理自定义工具提示的呈现(即toolstripmenuitem的OnMouseOver、OnMouseLeave事件)。您可能可以创建使用自定义工具提示的customtoolstripmenuitem,但我不确定toolstripmenuitem是否公开工具提示属性/对象

好的,多亏了和,解决方案如下:

  • 已初始化的工具提示的静态实例

    toolTip = new ToolTip();
    toolTip.OwnerDraw = true;
    toolTip.Draw += new DrawToolTipEventHandler(tooltip_Draw);
    toolTip.Popup += new PopupEventHandler(tooltip_Popup);    
    toolTip.UseAnimation = true;
    toolTip.AutoPopDelay = 500;
    toolTip.AutomaticDelay = 500;
    
  • 工具提示的弹出事件以设置其大小

    void tooltip_Popup(object sender, PopupEventArgs e)
    {
        e.ToolTipSize = TextRenderer.MeasureText(toolTipText, new Font("Courier New", 10.0f, FontStyle.Bold));
        e.ToolTipSize = new Size(e.ToolTipSize.Width + TOOLTIP_XOFFSET, e.ToolTipSize.Height + TOOLTIP_YOFFSET);
    }
    
  • 实际图形的工具提示绘制事件

    void tooltip_Draw(object sender, DrawToolTipEventArgs e)
    {
    Rectangle bounds = e.Bounds;
    bounds.Offset(TOOLTIP_XOFFSET, TOOLTIP_YOFFSET);
    DrawToolTipEventArgs newArgs = new DrawToolTipEventArgs(e.Graphics, e.AssociatedWindow, e.AssociatedControl, bounds, e.ToolTipText, toolTip.BackColor, toolTip.ForeColor, new Font("Courier New", 10.0f, FontStyle.Bold));
        newArgs.DrawBackground();
        newArgs.DrawBorder();
        newArgs.DrawText(TextFormatFlags.TextBoxControl);
    }
    
  • ToolStripMenuItem的MouseEnter事件以显示工具提示

    System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem);
    toolTip.SetToolTip(item.Owner, "ToolTipText");
    

我知道我在这次聚会上迟到了一点,但您可以使用反射来设置用于呈现工具提示的工具提示实例。完成后,您可以像通常一样使用Draw方法

public void SetToolTipInstance(ToolStrip ts, ToolTip tt)
{
    Type type = ts.GetType.BaseType;
    int propToolTip = Convert.ToInt32(type.GetField("PropToolTip", BindingFlags.NonPublic | BindingFlags.Static).GetValue(ts));
    dynamic ps = type.BaseType.GetProperty("Properties", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ts);
    ps.GetType.GetMethod("SetObject", BindingFlags.Instance | BindingFlags.Public).Invoke(ps, {propToolTip,tt});
}

我怀疑您可能需要使用许多第三方工具提示组件中的一个,例如不幸的是,我不能使用任何第三方组件。这里有些东西没有意义。您已经标记了问题WPF,但您所谈论的是一个
ToolStripMenuItem
控件。这是一个WinForms控件。你用哪一种?我想这会有很大的不同,你是对的。我的错。我删除了WPF标记问题不在于从ToolTip继承,而在于将其提供给ToolStripMenuItem。您必须自己处理自定义工具提示的呈现(即ToolStripMenuItem的OnMouseOver、OnMouseLeave事件)。您可能可以创建使用自定义工具提示的customtoolstripmenuitem,但我不确定toolstripmenuitem是否公开工具提示属性/对象。toolstripmenuitem不公开工具提示属性/对象是我决定在此处提问的主要原因。这就是为什么我提供了创建自定义工具提示的答案(您可以在其中更改字体设置),然后更新您必须处理自定义工具提示的呈现。此外,仅因为默认控件不公开属性,并不意味着它不包含私有/内部属性(也称为未公开)属性。抱歉,我误解了你之前的评论。现在它确实给了我一个新的方向,根据这个方向,我发现了以下内容。希望它能回答我的问题。+1感谢你发布最终解决方案!这样,如果其他人带着同样的问题来到这里,他们就会知道你是如何解决的。我还为你格式化了代码。T使格式在项目符号中工作的诀窍是缩进8个空格,而不是普通的4个空格。我一直在寻找一个稍微相关的问题的解决方案:在toolstrip的一些按钮上显示带有自定义文本的工具提示,但不是在所有按钮上。不需要自定义图形,但禁用toolstrip的内置工具提示,以及handli禁用ToolStripMenuItem的MouseEnter和MouseLeave以显示项目的工具提示文本(如果该文本不为null或为空),效果很好。对我来说效果很好,尽管在某些情况下,我会得到一个额外的(空白)工具提示,这似乎是在我的窗口重新编辑使用工具提示的按钮控件时出现的)。为了解决这个问题,我确保我的MouseLeave处理了工具提示,并在MouseHover中重新创建了工具提示。显然需要两个听众之外的一个参考才能起作用。干得好。向上投票。实际上,在默认设置下,有时边框绘制不正确,我认为这只是Windows的另一个礼物:)在.NET 4.5中,我发现有必要强制工具提示隐藏在悬停事件处理程序中,如果它是“活动的:如果(customToolTip.Active)customToolTip.Hide()。。。为了让工具提示按需要消失。正如ElyaSh所说,Tony Abrams的答案和William Andrus的解决方案是创建自定义工具提示的一个很好的解决方案。它可以工作,但是如何为其
下拉项设置它呢?