Wpf 音乐编辑的歌词

Wpf 音乐编辑的歌词,wpf,editor,richtextbox,rich-text-editor,music-notation,Wpf,Editor,Richtextbox,Rich Text Editor,Music Notation,我正在尝试创建一个neume(格里高利圣歌)编辑器。我确实做了很多,但我被困在乐谱下的歌词主题上 基本上,我试图解决的问题是:有一些独立的用户控件块。在它们下面应该有文本区域来放置歌词。关键是——歌词是富文本(但只有文本——没有表格、图像等) 为了让事情变得更有趣——我的用户控件呈现的图像必须知道下面文本中第一个元音的位置(第一个元音——我们称之为注释——必须精确地放在第一个元音的上方) 我真的在努力把它完成。我曾考虑过使用RTB,但重新调整它的大小存在整个问题-歌词的长度基本上是无限的-(它向

我正在尝试创建一个neume(格里高利圣歌)编辑器。我确实做了很多,但我被困在乐谱下的歌词主题上

基本上,我试图解决的问题是:有一些独立的用户控件块。在它们下面应该有文本区域来放置歌词。关键是——歌词是富文本(但只有文本——没有表格、图像等)

为了让事情变得更有趣——我的用户控件呈现的图像必须知道下面文本中第一个元音的位置(第一个元音——我们称之为注释——必须精确地放在第一个元音的上方)

我真的在努力把它完成。我曾考虑过使用
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实例,因为我需要能够格式化文本。