Wpf 音乐编辑的歌词
我正在尝试创建一个neume(格里高利圣歌)编辑器。我确实做了很多,但我被困在乐谱下的歌词主题上 基本上,我试图解决的问题是:有一些独立的用户控件块。在它们下面应该有文本区域来放置歌词。关键是——歌词是富文本(但只有文本——没有表格、图像等) 为了让事情变得更有趣——我的用户控件呈现的图像必须知道下面文本中第一个元音的位置(第一个元音——我们称之为注释——必须精确地放在第一个元音的上方) 我真的在努力把它完成。我曾考虑过使用Wpf 音乐编辑的歌词,wpf,editor,richtextbox,rich-text-editor,music-notation,Wpf,Editor,Richtextbox,Rich Text Editor,Music Notation,我正在尝试创建一个neume(格里高利圣歌)编辑器。我确实做了很多,但我被困在乐谱下的歌词主题上 基本上,我试图解决的问题是:有一些独立的用户控件块。在它们下面应该有文本区域来放置歌词。关键是——歌词是富文本(但只有文本——没有表格、图像等) 为了让事情变得更有趣——我的用户控件呈现的图像必须知道下面文本中第一个元音的位置(第一个元音——我们称之为注释——必须精确地放在第一个元音的上方) 我真的在努力把它完成。我曾考虑过使用RTB,但重新调整它的大小存在整个问题-歌词的长度基本上是无限的-(它向
RTB
,但重新调整它的大小存在整个问题-歌词的长度基本上是无限的-(它向下调整大小,而不是向右),并且绑定到RTB
真的很有趣
你能告诉我如何解决这个问题吗?这是一张小图片,我希望能解释我的问题
提前非常感谢 您看过TextBox.GetRectFromCharacterIndex方法吗 如果我正确理解了您的问题,您应该能够获得上面示例中字母“O”的rect 我有一个类似的问题,我需要在给定文本框的装饰层上绘制“红色曲线”,以表示自定义拼写检查器解决方案(WPF拼写检查器对我们来说太有限) 下面是该实现的部分示例,以防有所帮助
//loop through the invalid words and draw the squiggilies
foreach (var word in rslt)
{
//find the index of the start of the invalid word
int idx1 = tbx.Text.ToLower().IndexOf(word.ToLower());
//find the index of the end of the invalid word
int idx2 = idx1 + (word.Length);
if (idx1 == -1)
continue;
//get a rect defining the location in coordinates of the invalid word.
var rec1 = tbx.GetRectFromCharacterIndex(idx1);
var rec2 = tbx.GetRectFromCharacterIndex(idx2);
//if the word is not visible or not fully visible, do not show the red line.
if (tbx.ActualWidth > 0)
{
if (rec1.X < 0 || rec2.X > tbx.ActualWidth)
continue;
}
if (rec1.Y < 0)
continue;
//actually draw the line under the word
SquigglyAdorner ado = new SquigglyAdorner(tbx, word, rec1.X, rec2.X, rec2.Bottom);
adornerLayer.Add(ado);
}
//循环遍历无效的单词,并画出哑炮
foreach(rslt中的var字)
{
//查找无效单词开头的索引
int idx1=tbx.Text.ToLower().IndexOf(word.ToLower());
//查找无效单词结尾的索引
int idx2=idx1+(字长);
如果(idx1==-1)
继续;
//获取一个在无效单词坐标中定义位置的rect。
var rec1=tbx.GetRectFromCharacterIndex(idx1);
var rec2=tbx.GetRectFromCharacterIndex(idx2);
//如果单词不可见或不完全可见,请不要显示红线。
如果(tbx.ActualWidth>0)
{
如果(rec1.X<0 | | rec2.X>tbx.实际宽度)
继续;
}
如果(rec1.Y<0)
继续;
//在这个词下面画一条线
SquigglyAdorner ado=新SquigglyAdorner(tbx,word,rec1.X,rec2.X,rec2.Bottom);
Add(ado);
}
然后将该矩形转换为screen coord(或您需要的任何coord)谢谢您的回答。遗憾的是,我不能使用它。您引用一个文本框,而我需要给您一个RichTextBox实例,因为我需要能够格式化文本。