Как создать элемент управления Bold Label? - PullRequest
4 голосов
/ 28 ноября 2011

Я пытаюсь создать элемент управления Label , который автоматически отображает его текст жирным шрифтом.

Моя среда - это приложение C # Windows Forms, использующее .NET 3.5, Visual Studio.2010 SP1, Windows 7 Professional, SP1, 32-разрядный процессор.

Моя текущая реализация показана ниже.

Единственное требование, предъявляемое к этому полужирному элементу управления Label, заключается в том, что он должен вести себя точно так жестандартный элемент управления System.Windows.Forms.Label (как программно, так и в среде дизайнера WinForm), за исключением того факта, что для рисования текста используется жирный шрифт.

Вот некоторые проблемы, которые у меня возникают стекущая реализация:

  1. Я намерен использовать этот элемент управления с полужирной меткой во многих местах большого приложения, что приведет к сотням экземпляров этого элемента управления во время выполнения.Я без необходимости создаю новые объекты Font?Должны ли эти объекты Font быть уничтожены?Если да, то когда?

  2. Я хочу убедиться, что когда я локализую свое приложение (установите для свойства Localizable значение true для родительского контейнера), эта жирная метка будет хорошо работать с ресурсом WinFormМеханизм сериализации.Другими словами, если я перетащу этот полужирный ярлык в форму Windows, затем установите для Localizable значение true для формы, а затем нажмите кнопку «Сохранить», Visual Studio сериализует ресурсы моей формы в MyForm.Designer.cs.Это будет включать в себя экземпляр моего смелого ярлыка управления.Будет ли моя реализация установки шрифта для моей жирной метки испортить этот механизм сериализации ресурсов?

  3. Есть ли лучшая / более чистая реализация?Другие вопросы для рассмотрения?

[Код следует]

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;
        }
    }
}
}

1 Ответ

5 голосов
/ 28 ноября 2011

Я не понимаю, почему это не сработает для всех ваших сценариев использования:

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 операции набора будет уменьшать счетчик ссылок после завершения набора, а затем GC будет обрабатыватьэто позже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...