使用自定义字体在标签中绘制文本时参数无效
问题描述:
我使用自定义字体和定时器标签中的值发生变化的标签。我的应用程序开始最小化。当我显示应用程序时,有时会显示异常并且标签中的文字是红色的。使用自定义字体在标签中绘制文本时参数无效
这里我尝试调用异步方法用于标签文本变化
private void timer1_Tick(object sender, EventArgs e)
{
// create a delegate of MethodInvoker poiting to showTime function.
MethodInvoker simpleDelegate = new MethodInvoker(showTime);
// Calling showTime Async
simpleDelegate.BeginInvoke(null, null);
}
字体加载
public Form1()
{
InitializeComponent();
SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch); //event handler for windows lock
File.WriteAllBytes(appPath + "\\font.ttf", Resources.font); //copy font from resources
try
{
PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddFontFile(appPath + @"/font.ttf");
label1.Font = new Font(pfc.Families[0], 11, FontStyle.Bold);
}
catch
{
MessageBox.Show("Failed to load nice font." + "\r\n" + "Using standart font instead.", "Time app", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
这里是标签TET变化的方法
private void showTime()
{
label1.Text = time.ToString();
}
** * ** 异常文本 ** * ****
System.ArgumentException: Parameter is not valid.
at System.Drawing.FontFamily.GetName(Int32 language)
at System.Drawing.FontFamily.get_Name()
at System.Windows.Forms.Internal.WindowsFont.FromFont(Font font, WindowsFontQuality fontQuality)
at System.Windows.Forms.Internal.WindowsGraphicsCacheManager.GetWindowsFont(Font font, WindowsFontQuality fontQuality)
at System.Windows.Forms.TextRenderer.MeasureText(String text, Font font, Size proposedSize, TextFormatFlags flags)
at System.Windows.Forms.Layout.LayoutUtils.MeasureTextCache.GetUnconstrainedSize(String text, Font font, TextFormatFlags flags)
at System.Windows.Forms.Layout.LayoutUtils.MeasureTextCache.TextRequiresWordBreak(String text, Font font, Size size, TextFormatFlags flags)
at System.Windows.Forms.Label.CreateTextFormatFlags(Size constrainingSize)
at System.Windows.Forms.Label.CreateTextFormatFlags()
at System.Windows.Forms.Label.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Label.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
问题:如何在使用自定义的字体林摆脱这种异常?
答
的问题是,在pfc
变量PrivateFontCollection
实例超出范围,并且有时被吸入首次(这似乎获得的强引用实例之后)控制之前被收集。链接
class Form1 : Form
{
readonly PrivateFontCollection _pfc = new PrivateFontCollection();
public Form1()
{
...
_pfc.AddFontFile(appPath + @"/font.ttf");
...
}
}
404:
移动实例的方法外,以防止从GC收集它。也许类似的信息可以在http://dotnet-coding-helpercs.blogspot.com/2009/06/how-to-embed-true-type-font-in-using-c.html? – erdomke 2013-05-23 19:02:46