我正在寻找一种在 C# 路径中插入省略号的方法,并在 stackoverflow 上找到了答案:没有 Win32 API 调用的 C# 路径省略号
使用VS2010和.Net 4.0的RTM版本,我无法让建议的方法起作用。我搜索了'Net并找到了使用相同方法的示例代码,但它以同样的方式失败了。
您可以在下面的代码中看到我试图缩短的字符串。
调用 MeasureText 方法后,输入字符串 (OriginalName) 和输出字符串 (ellipsisizedName) 均如下所示:
d:\abcd\efgh\ijkl\mnop\qrst\...\test.txt\0F\GHIJ\KLMN\OPQR\STIV\WXYZ\test.txt
两个问题:
1) 生成的字符串被 narfed(路径按预期被截断,但后面跟着看起来像 C 风格的 null 终止符和原始路径的一大块)。
2) My 原来的字符串被改变了与输出字符串相同。
难道我做错了什么?
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);
}
}
}
天哪,你发现了一个巨大的错误。 TextRenderer 类中调用 DrawTextEx() 的 P/Invoke 被中断。该 API 函数将写回字符串,这是允许的,因为 cchText 参数是 LPTSTR,而不是 LPCTSTR。这会破坏 .NET 字符串内容both变量,因为字符串是内部的。
该错误并非特定于 .NET 4.0,我在 .NET 3.5 SP1 的 ReferenceSource 中也看到了错误,并且可以在 VS2008 上重现它。问题出在内部 WindowsGraphics.MeasureText 函数中。您可以在 connect.microsoft.com 上报告该错误。
一种可能的解决方法是更改字符串,使其被复制并且不会影响原始字符串:
string ellipsisedPath = OriginalPath + '\0';
但在这种情况下,更好的解决方法是不传递ModifyString选项,它没有任何作用。这也更安全,第一个解决方法仍然有可能破坏垃圾收集堆。 Microsoft 的修复也同样简单,它应该只屏蔽修改字符串选项。据记载,它没有任何效果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)