我正在寻找一种在C#路径中插入省略号的方法,并在stackoverflow上找到答案:C#Path Ellipsis没有Win32 API调用
使用VS2010和.Net 4.0的RTM版本,我无法获得建议的方法.我搜索了'Net并找到了使用相同方法的示例代码,但它以同样的方式失败了.
您可以在下面的代码中看到我正在尝试缩短的字符串.
调用MeasureText方法后,输入字符串(OriginalName)和输出字符串(ellipsisedName)如下所示:
d:\ ABCD\EFGH\IJKL\MNOP\QRST\...\test.txt的\ 0F\GHIJ\KLMN \使用opqr\STIV\WXYZ\test.txt的
两个问题:
1)生成的字符串被填充(路径按预期截断,但后面跟着看起来像C样式的终止null和原始路径的块).
2)我的原始字符串被更改为与输出字符串相同.
难道我做错了什么?
namespace WindowsFormsApplication2 {
public partial class Form1 : Form {
public Form1()
{
InitializeComponent();
string OriginalPath = @"d:\abcd\efgh\ijkl\mnop\qrst\uvwx\yzAB\CDEF\GHIJ\KLMN\OPQR\STIV\WXYZ\test.txt";
string ellipsisedPath = OriginalPath;
Size proposedSize = new Size(label1.Width, label1.Height);
TextRenderer.MeasureText(ellipsisedPath, label1.Font, proposedSize, TextFormatFlags.ModifyString | TextFormatFlags.PathEllipsis);
}
}
}
Run Code Online (Sandbox Code Playgroud)
天哪,你发现了一个巨大的错误。TextRenderer 类中调用 DrawTextEx() 的 P/Invoke 被中断。该 API 函数将写回到字符串中,这是允许的,因为 cchText 参数是 LPTSTR,而不是 LPCTSTR。这会破坏两个变量的 .NET 字符串内容,因为字符串是内部的。
该错误并非特定于 .NET 4.0,我在 .NET 3.5 SP1 的 ReferenceSource 中也看到了错误,并且可以在 VS2008 上重现它。问题出在内部 WindowsGraphics.MeasureText 函数中。您可以在 connect.microsoft.com 上报告该错误。
一种可能的解决方法是更改字符串,使其被复制并且不会影响原始字符串:
string ellipsisedPath = OriginalPath + '\0';
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,更好的解决方法是简单地不传递ModifyString选项,它没有任何作用。这也更安全,第一个解决方法仍然有可能破坏垃圾收集堆。Microsoft 的修复也同样简单,它应该只屏蔽修改字符串选项。据记载,它没有任何效果。