【问题标题】:Improve the way that I draw the SubItems in a Listview to assimilate the appearance of Windows改进我在 Listview 中绘制 SubItems 的方式以吸收 Windows 的外观
【发布时间】:2013-12-17 13:20:24
【问题描述】:

我想改进我的绘图,以便在调整列大小时写入默认窗口 Listview 在每个子项字符串末尾绘制的 ... 字符,就像您在此视频中看到的那样:

http://www.youtube.com/watch?v=J8LghvmLB4E

这是我用来绘制子项的代码:

    Dim bounds As Rectangle = e.Bounds
    bounds.X += 5
    bounds.Width -= 5

    Select Case e.Header.TextAlign

        Case HorizontalAlignment.Left

            TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.SubItem.Font,
                                  bounds, e.SubItem.ForeColor,
                                  TextFormatFlags.Left)

        Case HorizontalAlignment.Center

            TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.SubItem.Font,
                                  bounds, e.SubItem.ForeColor,
                                  TextFormatFlags.GlyphOverhangPadding Or TextFormatFlags.HorizontalCenter)

        Case HorizontalAlignment.Right
            TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.SubItem.Font,
                                  bounds, e.SubItem.ForeColor,
                                  TextFormatFlags.Right)

    End Select

【问题讨论】:

  • 我很高兴看到您浪费大量时间尝试重新发明轮子,只是因为您没有注意我关于使用 WPF 的建议(它已经内置了所有这些功能)
  • 他们到底有什么问题?默认的 Windows 方法是如何不足的?
  • @HighCore 非常感谢您的讽刺?但我不知道 XAML。在 WPF 中,它的功能名称是什么?
  • @Plutonix 调整列大小时,默认列表框会写一些点“...”...我自己的列表视图不这样做,因为我不知道如何重现该技术。跨度>
  • @elektrostudios 这不是讽刺,我是 100% 认真的。自从你开始这个项目以来,我一直在告诉你使用 WPF,现在你被一堆可怕的不可移植、不可自定义、不可扩展的 winforms hack 所困扰。如果您不知道某些东西,例如 XAML,您可以完美地学习它。这不是不可能的,而且比 hack 背后的任何 winforms 程序代码都要好。

标签: .net vb.net winforms listview user-controls


【解决方案1】:

我认为TextRenderer 可能是错误的方法。如果您使用DrawString,其中一个重载包含StringFormat 参数:

Graphics.DrawString(String, System.Drawing.Font, Drawing.Brush,
              Drawing.RectangleF, Drawing.StringFormat)

您可以创建一个StringFormat 来控制文本的呈现方式,其中一个选项是StringTrimming,这反过来又允许您指定ellipsis(“...”)。它们是:

    StringTrimming.EllipsisCharacter
    StringTrimming.EllipsisPath
    StringTrimming.EllipsisWord
    StringTrimming.Word         ' just chops at a word

和他们一起玩,看看你最喜欢哪一个。

我没有过多地使用 TextRenderer,但它的一个重载包括 TextFormatFlags,它允许一些省略号 (EndEllipsis)。我不知道它的格式与 StringFormat 方法有何不同,但它似乎没有那么广泛 - 可能是一个印章。

【讨论】:

  • TextFormatFlags.EndEllipsis 完成了这项工作!,我不使用DrawString,因为绘制的字符串在调整大小时会产生令人讨厌的弹出效果,至少为此使用TextRenderer 确实更好跨度>
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多