我正在制作一个与Google日历,iCalendar,Outlook日历类似的日程安排应用程序......正如您在此类应用中看到的那样,预定事件以矩形表示,其中可能非常小,特别是如果你整整一周都在观看。
我的挑战是给用户一个有意义的总结"在使用矩形中的文本单击它之前的事件。文字应该非常紧凑。为此,我希望它以一种非常常见的方式包装行,但我怀疑.NET能够原生地处理它。
如果单个单词比矩形宽,则只显示该单词的开头。但是如果后面的单词部分落在矩形之外,则在遇到空格时仍然会发生包装。并不是每个空间都会导致包装到下一行,因为如果两个或更多的单词碰巧适合一行就行了。
我怀疑答案在于StringFormat,StringTrimming和FormatFlags的功能,但我还没有找到合适的组合来实现目标。
例如,如果我们有......
Chuck Norris
Dentist Appointment
由于空间有限,它可能会......
Chuc
Norr
Denti
Appo
我不希望它成为:
Chuc
k
Norr
is
Dent
ist
Appo
intme
nt
正如您在此示例中所看到的,如果用户已经知道查克诺里斯是谁,那么信件的存在" k"字母"是"不帮助用户识别名称。事实上,这些信件的存在可能会迫使“牙医预约”#34;从视图中隐藏,因为垂直空间也是有限的。
我已经知道如何在一个以正常方式包装的矩形中绘制文本,并且我也知道如何避免绘制任何落在矩形之外的文本。我不知道的是如何在遇到空格(或回车)时将其包裹起来,同时如果一个单词比矩形宽,则防止它包裹中间单词。有帮助吗?
答案 0 :(得分:3)
尝试将TextRenderer.DrawText
方法与TextFormatFlags.WordBreak
标志一起使用:
使用面板的绘画事件的示例:
Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Panel1.Paint
Dim sb As New StringBuilder
sb.AppendLine("Chuck Norris")
sb.AppendLine("Dentist Appointment")
e.Graphics.Clear(Color.White)
TextRenderer.DrawText(e.Graphics, sb.ToString, Panel1.Font, _
Panel1.ClientRectangle, Color.Black, Color.Empty, _
TextFormatFlags.WordBreak)
End Sub
您还可以添加TextFormatFlags.WordEllipsis
来添加" ..."到矩形边缘切断的单词的末尾:
TextRenderer.DrawText(e.Graphics, sb.ToString, Panel1.Font, _
Panel1.ClientRectangle, Color.Black, Color.Empty, _
TextFormatFlags.WordBreak Or TextFormatFlags.WordEllipsis)
答案 1 :(得分:1)
除了手动之外,我没有任何方法可以做到这一点。
据我所知,没有任何标准控件可以按照您想要的方式运行 - 下一步是自己实现它或找到已有的其他人。
也就是说,您可以对评论中描述的方法进行小的改进。希望你能把它从“有点笨拙”转移到“极简主义”
通过使用自定义控件,您不会更改基础Text
属性 - 所以如果您想要读取它,它将与您放入它的方式相同。这还有另一个好处你不必记得在任何你希望它出现的地方进行相同的转换 - 只需重复使用你的控件。
如果从一个几乎完全符合要求的控件继承(除非你有其他要求,很可能是标签),它不应该是太多的代码/太多的处理。
如果你还没有。您几乎肯定希望自定义对象无论如何都要表示日程表条目 - 更易于阅读,维护和编码,在应用程序中提供标准外观等。
道歉,如果你已经知道这一切 - 因为你没有很多SO问题/答案,那么衡量你的经验水平是很困难的。