C # Windows Form Label Шрифт Проблема - PullRequest
1 голос
/ 23 ноября 2011

У меня есть пользовательский ярлык в приложении winform. Я изменяю содержимое ярлыка между потоками. Я открываю фоновый поток для чтения входных данных и вызываю свой многопоточный метод для изменения содержимого метки, используя следующий код:

// ... invoke a cross-thread method to reset progress label information
Set_ProgressInfo("Reading data from input data file ... inputData");

Мой метод кросс-нити:

public void Set_ProgressInfo(string text)
{
    if (this.progressInfo.InvokeRequired)
    {
        this.progressInfo.BeginInvoke(new MethodInvoker(delegate()
            { Set_ProgressInfo(text); }));
    }
    else
    {
        this.progressInfo.Text = text;

        this.progressInfo.Location = new System.Drawing.Point(55, 595);
        this.progressInfo.ForeColor = System.Drawing.Color.AliceBlue;
        this.progressInfo.Font = new System.Drawing.Font("Verdana", 10.0f,
            System.Drawing.FontStyle.Bold);

        // Auto size label to fit the text
        // ... create a Graphics object for the label
        using (var g_progressInfo = this.progressInfo.CreateGraphics())
        {
           // ... get the Size needed to accommodate the formatted text
           Size preferredSize_progressInfo = g_progressInfo.MeasureString(
           this.progressInfo.Text, this.progressInfo.Font).ToSize();

           // ... pad the text and resize the label
           this.progressInfo.ClientSize = new Size(
           preferredSize_progressInfo.Width + (BSAGlobals.labelTextPadding),
           preferredSize_progressInfo.Height + (BSAGlobals.labelTextPadding));
       }
    }
}

Все отлично работает, как и должно, кроме:

Когда я изменяю размер шрифта в

this.progressInfo.Font = new System.Drawing.Font("Verdana", 10.0f,
    System.Drawing.FontStyle.Bold);

с 10.0f до 8.0f, только часть строки «Чтение данных из файла входных данных ...» в вызывающем компоненте

Set_ProgressInfo("Reading data from input data file ... inputData");

дисплеи. По некоторым причинам размер вычисляется неправильно при меньшем размере шрифта. Я что-то здесь упускаю? Я уже давно борюсь с этим и просто не вижу причины этого. Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Вы используете неправильный метод измерения, вместо этого используйте TextRenderer.MeasureText ().Метрики шрифта для метода рендеринга .NET 1.x (Graphics.DrawString) не совпадают.Технически вы должны использовать оба, используя значение свойства UseCompatibleTextRendering метки, но это можно легко пропустить.

Поддерживайте использование свойств метки Padding и AutoSize, так что это все автоматически.

1 голос
/ 23 ноября 2011

Вы пытались сделать элемент управления недействительным после изменения размера шрифта? Мог бы сделать трюк ..

http://msdn.microsoft.com/en-us/library/598t492a.aspx

...