c# - 在没有 Win32 API 调用的情况下将省略号添加到 WinForms 程序中的路径(重新访问)

标签 c# .net-4.0

我正在寻找一种在 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/

相关文章:

.net - 在 Framework 4.0 项目中使用 .NET Framework 4.5 dll

c# - MVVM - 具有多态性的集合

c# - 将逐个元素添加到 ListView 而不阻塞 UI

c# - 报告内发现问题 "Column IDs"

c# - ASP.net 列表框 - 选择索引始终为 -1,即使使用 !ispostback

c# - C# 类型如何工作?

c# - IList<T>、IEnumerable<T> 和 ObservableCollection<T>

c# - 在读取 EventRecord 类中的 LevelDisplayName 属性时出现异常

c# - 具有卡住列的 wpf 网格

c# - 当 child 发生变化时更新 parent