鼠标悬停上的Quirky Winforms字体行为

时间:2009-09-30 13:41:05

标签: c# .net winforms events user-interface

所以我正在研究支持编辑的Label的基本子类。编辑部分工作正常 - 我在插入时插入没有背景颜色或边框的文本框,在输入或失去焦点时提交更改。

给我带来麻烦的小东西与一些基本的字体样式有关。标签是使用MouseHover事件(如超链接)下划线,然后丢失下划线。大多数情况下,它都有效,但偶尔,MouseHover会导致字体恢复为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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我想我解决了它,虽然它感觉像是一个补丁而不是最干净的解决方案。我取消了_fontBeforeHover并创建了_originalFont。然后我覆盖了标签的Font属性,并在setter中将_originalFont设置为标签的设置。然后,在我的MouseHoverMouseLeave事件中,我使用了一种新方法SetFont()来更改字体。在SetFont()中,我指定base.Font而不是使用重写的属性。如果我使用了被覆盖的属性,我总是将_originalFont重新分配给在事件期间更改标签字体的任何内容。

如果我不需要所有额外的代码,肯定会很好,但是: - )

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

答案 2 :(得分:0)

很抱歉双重答案,但也许你可能想考虑在paint事件中通过DrawString自己绘制文本,这样你就不会设置Font属性。除非明确设置,否则Font属性从Parent的字体中获取它的值。

答案 3 :(得分:0)

在您的用户控件上为您的控件创建一个mousehover事件,像这样(或其他事件类型)

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

在承载UserControl的WinFrom上,UserControl处理MouseOver

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

在WinForm上调用此方法

    private void ThumbnailMouseHover(object sender, EventArgs e)
    {

        ThumbImage thumb = (ThumbImage) sender;

    }

ThumbUmage是usercontrol的类型