winforms - 标准多行文本框,希望每一行都自动添加项目符号
问题描述
我有一个多行文本框,我希望每个换行符在下一行字符之前还包含一个项目符号和一个空格。Chr(149) AKA hex 95 与我使用的字体看起来不错。此外,第一行应该有一个项目符号,它会在添加任何文本时自动出现。
基本上,我想要一个文本框,它只是一个项目符号列表。我不想让用户能够斜体或其他任何东西,所以没有 Richtextbox。
我可以通过简单的替换将数据加载到文本框中来处理这个问题,但我希望它在输入或从剪贴板粘贴时即时发生,并在每次 [Enter] 击键后自动添加项目符号或粘贴带有换行符的文本,并且文本光标不会不恰当地跳来跳去。
因为我经常看到“你为什么要这样做?”的回复。我将解释:用户将使用此文本框输入有关特定客户的一些简短信息,例如“门代码 #1234”或“客户不喜欢大蒜”。或“一定要提到她的狗。” 它几乎可以是任何东西,偶尔是几句话,但每个“点”(即使它是一个段落)都应该在视觉上与众不同。我不希望空白行占用屏幕空间来分隔段落,但项目符号将使每个“条目”作为其自己的重点而明显明显。当给定点在文本框右侧附近结束时,这尤其有价值,因此下一个点似乎不是前一个点的一部分。
我在“有点开始工作”下面的代码可以通过在键入时将文本光标放回原处(使用 Selstart)而不是跳到开头来改进它,但我还没有走到那一步,因为它也会在删除项目符号,以及粘贴或剪切时。它也可以通过在第一行之前添加一个项目符号来改进。那些事情很容易。
我想要一个简单的“linebreak = linebreak and bullet”算法,它可以在剪切、粘贴、键入、删除时运行,我怀疑它已经存在于某个地方,但我还没有找到这样的代码。
或者,如果有一种简单的方法可以为文本框提供“自定义字体”,其中换行符实际上包含一个看起来像一个大点的可见字形,那也可以。
感谢您阅读我的问题。
Private Sub tbOfficeNotes_TextChanged(sender As Object, e As EventArgs) Handles tbOfficeNotes.TextChanged
Static MakingChanges As Boolean = False
If MakingChanges Then Exit Sub
Dim s As String = Replace(Replace(tbOfficeNotes.Text, vbCrLf, vbLf), vbCr, vbLf)
'The line above replaces any form of newline with LF only.
s = Replace(s, Chr(149) & " ", "")
MakingChanges = True
'Avoids a recursive loop as the next line would force this event to trigger from itself.
tbOfficeNotes.Text = Replace(s, vbLf, vbCrLf & Chr(149) & " ")
MakingChanges = False
End Sub
解决方案
推荐阅读
- c++ - 删除后剩余的堆数组的剩余元素[]
- http - 芭蕾舞女演员:如何通过电子邮件发送附件
- typescript - TypeScript:需要类似于 ReturnType<...> 的东西,但对于第一个函数参数的类型
- .htaccess - 从没有history.replaceState的url隐藏查询字符串
- javascript - 在节点化的 Javascript 中使用全局变量(HowTo)
- jsf - ViewScoped Bean 在 commandLink 上重建
- java - 连接到安卓热点的PC通过TCP/IP访问安卓应用
- android - 如何使用 recycleviews 嵌套列表视图?
- sql - osquery - 如何使用 osquery 检索文件来源?
- c# - 获取 UWP 应用程序的当前登录用户需要很长时间才能执行