C#MeasureString不起作用,没有结果

时间:2012-10-31 14:25:09

标签: c#

已解决:

  

在项目设置中禁用“优化代码”后,一切正常运作


我在三个项目中有以下代码...一个新创建的空白项目和两个实际项目。在新创建的空白一个和一个实际项目中,它可以工作。但在第三个项目中,它没有。

System.Drawing.Bitmap m = new System.Drawing.Bitmap((int)(this.NomLabel.Size.Width * pcntDbl), (int)(this.NomLabel.Size.Height * pcntDbl));
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(m);
System.Drawing.Font stringFont = new System.Drawing.Font("Arial", (float)(this.NomLabel.Font.Size * pcntDbl), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
float foo = g.MeasureString(this.NomLabel.Text, stringFont).Width;

当我说不,错误是'foo在当前上下文中不存在'是尝试访问foo时的错误。我把所有东西都放在了try / catch块中,没有任何东西被抛出。我不能使用foo(很明显,但我需要)并且不确定这里发生了什么。相同的代码适用于新创建的空白项目。奇怪的是,将最后一行更改为

string foo = g.MeasureString(this.NomLabel.Text, stringFont).Width.ToString();

成功地将float发送到一个字符串,但我无法将其转换回double或int,它做同样的事情。同样,我的意思是它看起来像我执行它时执行代码行,但没有做任何事情。任何人都知道发生了什么或我能尝试什么?谢谢!

顺便说一下,这个项目太大了,无法将它放在一个新项目中,供那些想知道的人使用。

编辑:TextRenderer.MeasureString做同样的事情。看起来它执行但是在尝试将宽度保存为int变量时没有返回任何内容。

编辑2:我刚刚添加了

int temp = (int)foo; 

虽然我现在可以读取foo变量,但我无法读取临时变量。

编辑3:它所在的函数由构造函数调用。我这样做是为了明确调用这个函数而不是在构造函数中,它仍然无法正常工作。我也为这块代码上面的NomLabel安装了SuspendLayout()并将其移到了这段代码之下,但仍然没有用。

当执行foo行并移动到临时行时,我可以看到foo变量及其值。但是一旦我到达临界线并尝试执行它,它会跳转到下一行代码,我看不到任何东西。同样,所有这些在全新的项目中都运行良好,所以我不明白这个问题可能是什么问题。

编辑4:我将现有(损坏的)csproj文件复制到空白项目中,从中删除旧文件和引用,添加了我的空白(新)文件并且无法正常工作。我认为它与csproj文件有关,因为它是唯一随着空白项目而改变的东西。

1 个答案:

答案 0 :(得分:1)

在项目设置中禁用“优化代码”时,一切正常。