C# 如何使标签在鼠标移动时变粗,然后恢复正常

C# 如何使标签在鼠标移动时变粗,然后恢复正常,c#,winforms,mouse,C#,Winforms,Mouse,我正在尝试创建一个标签,该标签在没有任何运气的情况下被动态更改为粗体字体。在事件处理程序中使用并更改发送者的属性: private void label1_MouseEnter(object sender, EventArgs e) { var font = ((Label)sender).Font; ((Label)sender).Font = new Font(font, FontStyle.Bold); font.Dispose(); } private vo

我正在尝试创建一个标签,该标签在没有任何运气的情况下被动态更改为粗体字体。

在事件处理程序中使用并更改
发送者的属性:

private void label1_MouseEnter(object sender, EventArgs e)
{
    var font = ((Label)sender).Font;

    ((Label)sender).Font = new Font(font, FontStyle.Bold);

    font.Dispose();
}

private void label1_MouseLeave(object sender, EventArgs e)
{
    var font = ((Label)sender).Font;

    ((Label)sender).Font = new Font(font, FontStyle.Regular);

    font.Dispose();
}
在事件处理程序中使用并更改
发送方的属性:

private void label1_MouseEnter(object sender, EventArgs e)
{
    var font = ((Label)sender).Font;

    ((Label)sender).Font = new Font(font, FontStyle.Bold);

    font.Dispose();
}

private void label1_MouseLeave(object sender, EventArgs e)
{
    var font = ((Label)sender).Font;

    ((Label)sender).Font = new Font(font, FontStyle.Regular);

    font.Dispose();
}

虽然目前被接受的答案在技术上没有问题,但我想提供一个稍微不同的选择,我认为这会使管理和跟踪这里发生的事情变得更加容易

这种方法存储字体的两个本地副本(一个粗体,一个普通)。然后,您可以交换鼠标事件中的字体引用,您只需要在处理父类(或更改字体)时处理字体

此外,这还增加了一些错误处理,人们在处理字体和鼠标事件时往往会忘记这些错误处理(即尝试捕获字体创建,因为它可能会失败,并在处理时注销鼠标事件处理程序)

public class MyClass
{
    Font _normalFont;
    Font _boldFont;

    public MyClass() : IDisposble
    {
        try
        {
            _normalFont = new Font("Arial", 9);
            _boldFont = new Font("Arial", 9, FontStyle.Bold);
        }
        catch
        {
            //error handling
        }

        label1.MouseEnter += label1_MouseEnter;
        label1.MouseLeave += label1_MouseLeave;
    }

    private void label1_MouseEnter(object sender, EventArgs e)
    {
        var font = ((Label)sender).Font;

        ((Label)sender).Font = new Font(font, FontStyle.Bold);

        font.Dispose();
    }

    private void label1_MouseLeave(object sender, EventArgs e)
    {
        var font = ((Label)sender).Font;

        ((Label)sender).Font = new Font(font, FontStyle.Regular);

        font.Dispose();
    }

    public void Dispose()
    {
        label1.MouseEnter -= label1_MouseEnter;
        label1.MouseLeave -= label1_MouseLeave;

        if(_normalFont != null)
        {
            _normalFont.Dispose();
        }

        if(_boldFont != null)
        {
            _boldFont.Dispose();
        }
    }
}

虽然目前被接受的答案在技术上没有问题,但我想提供一个稍微不同的选择,我认为这会使管理和跟踪这里发生的事情变得更加容易

这种方法存储字体的两个本地副本(一个粗体,一个普通)。然后,您只需交换鼠标事件中的字体引用,您只需在处理父类(或更改字体)时处理字体

此外,这还增加了一些错误处理,人们在处理字体和鼠标事件时往往会忘记这些错误处理(即尝试捕获字体创建,因为它可能会失败,并在处理时注销鼠标事件处理程序)

public class MyClass
{
    Font _normalFont;
    Font _boldFont;

    public MyClass() : IDisposble
    {
        try
        {
            _normalFont = new Font("Arial", 9);
            _boldFont = new Font("Arial", 9, FontStyle.Bold);
        }
        catch
        {
            //error handling
        }

        label1.MouseEnter += label1_MouseEnter;
        label1.MouseLeave += label1_MouseLeave;
    }

    private void label1_MouseEnter(object sender, EventArgs e)
    {
        var font = ((Label)sender).Font;

        ((Label)sender).Font = new Font(font, FontStyle.Bold);

        font.Dispose();
    }

    private void label1_MouseLeave(object sender, EventArgs e)
    {
        var font = ((Label)sender).Font;

        ((Label)sender).Font = new Font(font, FontStyle.Regular);

        font.Dispose();
    }

    public void Dispose()
    {
        label1.MouseEnter -= label1_MouseEnter;
        label1.MouseLeave -= label1_MouseLeave;

        if(_normalFont != null)
        {
            _normalFont.Dispose();
        }

        if(_boldFont != null)
        {
            _boldFont.Dispose();
        }
    }
}

请注意,字体实现IDisposeable,因此您应该在替换字体之前先处理它。最好使用using()语句,而不是显式处理。如果新字体的构造函数中出现异常,我不想处理旧的、标签所有的字体。因此我不认为使用()这里可以。其他意见?我发现在控件之间共享字体(FontHandle private member)的情况。在这种情况下,Disposing()字体将破坏渲染。请注意,字体实现IDisposable,因此您应该在替换字体之前先处理字体。最好使用using()字体语句,而不是显式处理。如果新字体的构造函数内部出现异常,我不想处理旧的、标签拥有的字体。因此,我认为在这里使用()不合适。其他意见?我发现在控件之间共享字体(FontHandle private member)的情况。在这些情况下,处理()字体将中断渲染。