首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设计Bold标签控件?

如何设计Bold标签控件?
EN

Stack Overflow用户
提问于 2011-11-28 18:29:15
回答 1查看 7.9K关注 0票数 4

我正在尝试创建一个标签控件,该控件使用粗体字体自动显示其文本。

我的环境是一个C# Windows应用程序,使用.NET 3.5、Visual 2010 SP1、Windows7Professional、SP1、32位处理器。

我目前的实现如下所示。

我对这个粗体标签控件的唯一要求是,它的行为应该与标准的System.Windows.Forms.Label控件完全一样(无论是以编程方式还是在WinForm designer环境中),除非它使用粗体字体来绘制文本。

下面是我对当前实现的一些关注:

  1. I打算在大型应用程序中的许多地方使用这个粗体标签控件,从而在运行时生成数百个此控件的实例。我是否不必要地创建新的字体对象?这些字体对象应该被释放吗?如果是这样的话,什么时候?
  2. 我想确保当我本地化我的应用程序时(为父容器将可定位属性设置为true ),这个粗体标签将在WinForm资源序列化机制中表现良好。换句话说,如果我将此粗体标签拖到Windows窗体上,然后将该窗体的可定位设置为真,然后单击“保存”,Visual将将窗体的资源序列化为MyForm.Designer.cs。这将包括我的粗体标签控件的一个实例。我为我的大胆标签设置字体的实现会破坏这个资源序列化机制吗?
  3. 是否有更好/更干净的实现?其他需要考虑的问题?

代码如下

代码语言:javascript
复制
namespace WindowsFormsApplication1
{
using System.ComponentModel;
using System.Drawing;

/// <summary>
/// Represents a standard Windows label with a bolded font.
/// </summary>
public class BoldLabel : System.Windows.Forms.Label
{
    [Browsable( false )]
    [DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]
    public override Font Font
    {
        get
        {
            Font currentFont = base.Font;

            if ( currentFont.Bold )
            {
                // Nothing to do, since the current font is already bold.
                //
                return currentFont;
            }

            if ( currentFont.FontFamily.IsStyleAvailable( FontStyle.Bold ) )
            {
                // The current font supports the bold style, so create
                // a bold version of the current font and return it.
                //
                return new Font( currentFont, FontStyle.Bold );
            }
            else
            {
                // The current font does NOT support the bold style, so
                // just return the current font.
                //
                return currentFont;
            }
        }
        set
        {
            // The WinForm designer should never set this font, but we
            // implement this method for completeness.
            //
            base.Font = value;
        }
    }
}
}
EN

回答 1

Stack Overflow用户

发布于 2011-11-28 18:49:40

我不明白为什么这不适用于所有用例:

代码语言:javascript
复制
public partial class BoldLabel : Label
{
    public BoldLabel()
    {
        InitializeComponent();
        base.Font = new Font(base.Font, FontStyle.Bold);
    }

    public override Font Font
    {
        get
        {
            return base.Font;
        }
        set
        {
            base.Font = new Font(value, FontStyle.Bold);
        }
    }
}

处理正确序列化的关键是确保get操作总是很便宜,因此在set中工作也是如此。不应该担心创建太多的Font对象;它将创建任意数量的字体来完成工作,并且GC将捡起任何剩余的文件(例如,一旦集合完成,value的set操作将减少引用计数,然后GC将在稍后处理它)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8300499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档