2013-12-17 3 views
1

Я строю C# Gui. Включено в это событие обновления, которое вызывается каждую секунду или около того, чтобы обновить экран.Использование с шрифтом для установки шрифта TextBox

private void RefreshEverySecond_Tick(object o, EventArgs a) 
{ 

    if (Condition1) 
    { 
     QuickStatusTextBox.Text = "Condition 1"; 
     QuickStatusTextBox.Font = new Font(QuickStatusTextBox.Font, FontStyle.Bold); 
    } 
    else 
    { 
     QuickStatusTextBox.Text = "Condition 2"; 
     QuickStatusTextBox.Font = new Font(QuickStatusTextBox.Font, FontStyle.Regular); 
    } 

} 

В исследовании способа сделать это, я видел ответы, как это, которые поощряют такое поведение:

Easiest way to change font and font size with visual C#

НО я также видел много болтовни говоря, что я должен быть используя «Использовать» для IDisposable объектов, которые я собираю шрифт.

When should I use "using" blocks in C#?

И примеры использования со шрифтами: http://msdn.microsoft.com/en-us/library/yh598w02.aspx

Вопрос: Что такое право способ изменить текстовое поле от Жирный к Regular через определенные промежутки времени? Мой метод нарушает какие-либо правила или рискует утечкой памяти или конфликтом, потому что я не использую «использование», и есть ли «правильный» способ с использованием «Использования»? Помните это обновление каждую секунду ... поэтому я, вероятно, собираю сборщик мусора, но какие другие побочные эффекты будут укусить меня?

+0

Вы можете удалить предыдущий шрифт перед установкой нового. 'Font f = QuickStatusTextBox.Font; QuickStatusTextBox.Font = новый шрифт («Tahoma», 10, FontStyle.Bold); f.Dispose(); ' –

+0

Что касается вашего вопроса о том, нужно ли удалять шрифты или нет: [« Когда звонить Dispose »] (http://blogs.msdn.com/b/kimhamil/archive/2008/11/05/ когда к вызова Dispose.aspx) утверждает, что вы не должны распоряжаться шрифтами, если у вас не возникнут проблемы. Утилизация шрифтов, которые на самом деле все еще используются элементами управления, может открыть только другие can-o-worms. (Обратите внимание, что в примере MSDN вы связаны, объект Font не «отдан» к элементу управления, так что пример метод сохраняет бесспорное право собственности о том, что шрифте.) – elgonzo

+0

Я не уверен, сколько шрифтов вы используете, но почему бы не хранить их в некоторых статических переменных/статических списках, а не восстанавливать их каждый раз, когда вы вызываете ваши методы, связанные с шрифтом. Таким образом, вам не придется слишком беспокоиться о связанных с шрифтом утечках. – elgonzo

ответ

1

A Font объект в Winforms .NET фактически инкапсулирует две вещи: описание шрифта и дескриптор объекта GDI, который представляет этот шрифт. Одна из этих вещей представляет собой ограниченный ресурс (дескриптор GDI), а другой нет.

Хотя возможно, что элементы управления могут иметь элементы управления GDI шрифтов, которые используются для установки их свойств, встроенные элементы управления этого не делают. Вместо этого строка myControl.Font = myFont; вызовет myControl, чтобы зафиксировать описание шрифта, заключенного в myFont, и сделать свой собственный объект Font для внутреннего использования. Элемент управления гарантирует, что его объект внутреннего использования Font будет удален, если либо элемент управления установлен, либо его myControl.Font установлен на другой шрифт, но элемент управления не будет располагать myFont и не заботится о том, когда он или нет. Интересно, что все равно, если myFont был удален даже до приведенное выше исполнение. Предполагая, что ничего не записал, чтение myControl.Font вернет ссылку на myFont, а не на внутренний объект шрифта элемента управления; если myFont был удален, то myControl.Font вернет ссылку на объект шрифта, который был удален (но все еще может использоваться для установки других элементов управления Font).

Если вы хотите наиболее точно обеспечить быстрое очистку ресурсов шрифтов GDI, любые объекты шрифтов, которые будут использоваться только как «шаблоны» и не будут использоваться для фактического рисования, могут быть удалены сразу после их создания. Я не знаю, следует ли это рекомендовать в качестве шаблона, поскольку я не могу найти какую-либо официальную документацию по поведению элементов управления Font, но представляется бесполезным иметь объекты шрифтов, содержащие ресурсы GDI, которые никогда не будут использоваться. Слишком плохое управление. Свойство «Font» не использует какой-то задокументированный класс FontDescription, который будет инкапсулировать только описание шрифта, но не дескриптор GDI, поскольку такой дизайн сделает вещи намного яснее.

+0

Так звучит, как вы говорите, я мог бы это сделать: используя (NewFont = new Font (QuickStatusTextBox.Font, (выберите форму)) {QuickStatusTextBox.Font = NewFont; ...} – RDP

+0

@ user2410814: Вы могли бы. Действительно, во всех версиях .NET, которые я видел, вы даже можете установить свойство 'QuickStatusTextBox.Font' после * использования', и оно все равно будет работать. Я действительно хочу, чтобы Microsoft документировала эту проблему, я не люблю полагаться на недокументированное поведение, но мне также не нравится оставлять зависающие ресурсы, и я не знаю другого безопасного способа написания метода типа SetControlFont (Control ctl, Font newFont) ', который не будет рисковать тем, что оставит заброшенный« Шрифт »болтающимся или удалив« Шрифт », который кто-то может ожидать на самом деле. – supercat

Смежные вопросы