【发布时间】:2011-08-13 09:05:39
【问题描述】:
我在 WPF 中开发的应用程序的主要目的是允许编辑并打印带有吉他和弦的歌词。
即使您不演奏任何乐器,您也可能已经看过和弦。为了给你一个想法,它看起来像这样:
E E6
I know I stand in line until you
E E6 F#m B F#m B
think you have the time to spend an evening with me
但是,我想要Times New Roman 字体,而不是这种丑陋的单间距字体,歌词和和弦都带有字距调整(粗体字体的和弦)。我希望用户能够编辑它。
RichTextBox 似乎不支持这种情况。以下是一些我不知道如何解决的问题:
- 和弦的位置固定在歌词文本中的某个字符上(或者更普遍的歌词行的
TextPointer)。当用户编辑歌词时,我希望和弦停留在正确的字符上。示例:
.
E E6
I know !!!SOME TEXT REPLACED HERE!!! in line until you
- 换行:在换行方面,2 行(第 1 行是和弦,第 2 行是歌词)在逻辑上是一行。当一个单词换行到下一行时,它上面的所有和弦也应该换行。同样,当和弦包裹它上面的单词时,它也会包裹。示例:
.
E E6
think you have the time to spend an
F#m B F#m B
evening with me
- 即使和弦距离太近,和弦也应该停留在正确的字符上。在这种情况下,一些额外的空间会自动插入到歌词行中。示例:
.
F#m E6
...you have the ti me to spend...
- 假设我有歌词行
Ta VA和和弦A。我希望歌词看起来像 而不是 。第二张图片在V和A之间没有紧缩。橙色线仅用于可视化效果(但它们标记了放置和弦的 x 偏移量)。用于生成第一个样本的代码是<TextBlock FontFamily="Times New Roman" FontSize="60">Ta VA</TextBlock>,第二个样本是<TextBlock FontFamily="Times New Roman" FontSize="60"><Span>Ta V<Floater />A</Span></TextBlock>。
关于如何让RichTextBox 做到这一点的任何想法?或者有没有更好的方法在 WPF 中做到这一点?我对Inline 或Run 有帮助吗?欢迎任何想法、技巧、TextPointer 魔术、代码或相关主题的链接。
编辑:
我正在探索解决这个问题的 2 个主要方向,但都导致了另一个问题,所以我提出了新问题:
- 尝试将
RichTextBox变成和弦编辑器 - 看看 How can I create subclass of class Inline?。 -
按照H.B. answer 中的建议,从
PanelsTextBoxes 等独立组件构建新编辑器。这将需要大量编码,并且还会导致以下(未解决的)问题:
编辑#2
Markus Hütter's high quality answer 向我展示了使用RichTextBox 可以完成更多工作,而当我尝试根据自己的需要对其进行调整时,我就预料到了。我现在才有时间详细探索答案。 Markus 可能是 RichTextBox 魔术师,我需要帮助我解决这个问题,但他的解决方案也存在一些未解决的问题:
- 这个应用程序将是关于“漂亮”的印刷歌词。主要目标是从排版的角度来看,文本看起来很完美。当和弦彼此太靠近甚至重叠时,Markus 建议我在其位置之前迭代地添加附加空格,直到它们的距离足够。实际上要求用户可以设置两个和弦之间的最小距离。应遵守该最小距离,除非必要,否则不得超过该距离。空格不够细——一旦我添加了最后一个需要的空间,我可能会在必要时使间隙变大——这会使文档看起来“糟糕”,我认为它不能被接受。 我需要插入自定义宽度的空间。
- 可能有没有和弦的行(只有文本),甚至可能有没有文本的行(只有和弦)。当
LineHeight设置为25或整个文档的其他固定值时,它将导致没有和弦的行上方有“空行”。当只有和弦而没有文字时,它们就没有空间了。
还有其他一些小问题,但我认为我可以解决它们,或者我认为它们不重要。无论如何,我认为马库斯的回答真的很有价值——不仅是为了向我展示可能的方式,而且作为一个使用 RichTextBox 和装饰器的一般模式的演示。
【问题讨论】:
-
注意:用户不必能够直接从编辑器编辑和弦(我可以添加一些上下文菜单来插入或更改和弦),甚至可以放置插入符号,但这会很好。所以用户唯一能做的就是编辑歌词行。当用户删除有和弦的字符时,和弦也可能被删除或只是转移到下一个字符。
-
+1 非常好的问题。我对 WPF 的 RichTextBox 有很多经验。我会考虑一下,看看我能不能想出什么办法。不过要先提出一个问题:是否允许反射?
标签: .net wpf user-interface richtextbox music-notation