我正在寻找一种在 C# 路径中插入省略号的方法,并在 stackoverflow 上找到了答案:C# Path Ellipsis without Win32 API call
使用 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) 生成的字符串被 narfed(路径按预期被截断,但后面跟着看起来像 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);
}
}
}
最佳答案
我的天啊,你发现了一个弥天大谎。在调用 DrawTextEx() 的 TextRenderer 类中使用的 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';
但在这种情况下更好的解决方法是不传递 ModifyString 选项,它没有任何用处。这也更安全,第一个解决方法仍有可能破坏垃圾收集堆。 Microsoft 的修复同样简单,它应该只是屏蔽掉 ModifyString 选项。它被记录为没有效果。
关于c# - 在没有 Win32 API 调用的情况下将省略号添加到 WinForms 程序中的路径(重新访问),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2640410/