代码之家  ›  专栏  ›  技术社区  ›  sergtk

鼠标悬停时的怪异WinForms字体行为

  •  0
  • sergtk  · 技术社区  · 15 年前

    所以我正在研究支持编辑的标签的基本子类。编辑部分工作得很好——我在单击时插入一个没有背景色或边框的文本框,在输入或失去焦点时提交更改。

    给我带来麻烦的一点就是一些基本的字体样式。标签是用鼠标悬停事件(如超链接)加下划线,然后去掉下划线。大多数情况下,它可以工作,但偶尔,鼠标悬停会导致字体恢复为WinForms默认值(8pt sans-serif),而不是执行操作。

    以下是事件处理程序:

        void BWEditableLabel_MouseHover(object sender, EventArgs e)
        {
            _fontBeforeHover = Font;
            Font hoverFont = new Font(
                _fontBeforeHover.FontFamily.Name,
                _fontBeforeHover.Size,
                _fontBeforeHover.Style | FontStyle.Underline
                );
            Font = hoverFont;
        }
    

    有些人可能会注意到最后一行并不是简单地说:

    Font = new Font(Font, Font.Style | FontStyle.Underline)

    我试过了,问题就出现了。您之前的当前版本是我试图解决此问题的版本。

    4 回复  |  直到 13 年前
        1
  •  0
  •   Hasani Blackwell    15 年前

    如果使用mouseenter和mouseleave事件怎么办?mouseenter将其设置为带下划线,mouseleave将其还原。

        2
  •  0
  •   sergtk    15 年前

    我想我解决了它,虽然它感觉像一个补丁,而不是最干净的解决方案。我不干了 _fontBeforeHover 创造 _originalFont . 然后我骑过了 Font 属性,并在setter中设置 原始字体 无论标签设置为什么。然后,在我的 MouseHover MouseLeave 事件,我用了一种新方法, SetFont() 更改字体。内 StfFon() ,我指派 base.Font 而不是使用重写属性。如果我使用重写的属性,我将始终重新分配 原始字体 无论我在活动期间将标签字体改为什么。

    如果我不需要所有额外的代码,当然会很好,不过:—)

    我绝对愿意接受更多的建议。

        3
  •  0
  •   Hasani Blackwell    15 年前

    很抱歉有两个答案,但您可能需要考虑在绘制事件中自己通过DrawString绘制文本,这样您就不会设置字体属性。除非显式设置,否则字体属性从父级的字体获取其值。

        4
  •  0
  •   fkerrigan    13 年前

    在用户控件上,为控件创建类似于此(或其他事件类型)的鼠标悬停事件

        private void picBoxThumb_MouseHover(object sender, EventArgs e)
        {
            // Call Parent OnMouseHover Event
            OnMouseHover(EventArgs.Empty);
        }
    

    在主机所在的Win上,用户控件具有此项,以便用户控件处理mouseover

    this.thumbImage1.MouseHover += new System.EventHandler(this.ThumbnailMouseHover);
    

    在WinForm上调用这个方法

        private void ThumbnailMouseHover(object sender, EventArgs e)
        {
    
            ThumbImage thumb = (ThumbImage) sender;
    
        }
    

    其中thumbumage是用户控件的类型