【问题标题】:Quirky Winforms Font Behavior On MouseHoverMouseHover 上古怪的 Winforms 字体行为
【发布时间】:2009-09-30 13:41:04
【问题描述】:

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

给我带来麻烦的小事与一些基本的字体样式有关。标签是用 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)

我试过了,问题就来了。您之前的当前版本是我为解决问题所做的尝试。

【问题讨论】:

  • 我很难过。另外,也许你应该重写 OnFontChanged 并缓存他带下划线和非下划线的字体,这样你就不必每次鼠标悬停在它上面时都创建一个新的字体。
  • 不知道这是否与您的问题有关,但您应该避免大量创建新的字体对象。而是创建您希望使用的 2 个不同的字体实例并在它们之间切换。
  • 你们是说我应该避免每次悬停时都创建新字体吗?那是因为它是一项昂贵的运行时操作吗?
  • 这是因为 Font 对象是限制在某个最大值的 Windows 资源。即使您的字体对象在离开处理函数后超出范围,实际的 windows 资源也可能不会立即释放。
  • 绝对是一个好点——谢谢你的提示。

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


【解决方案1】:

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

【讨论】:

  • 只是好奇——这个建议只是“试一试”还是 MouseEnter 在这些事情上的表现通常有点不同?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      在您的 WinFrom 主机上,UserControl 有这个供 UserControl 处理鼠标悬停

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

      在你的 WinForm 上调用这个方法

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

      ThumbUmage 是用户控件的类型

      【讨论】:

        猜你喜欢
        • 2011-10-28
        • 2011-05-01
        • 2013-06-07
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        相关资源
        最近更新 更多