3

我正在尝试创建一个 neume (gregorian chant) 编辑器。我确实做了很多工作,但我被困在乐谱下的歌词主题上。

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

为了让事情变得更有趣 - 我的用户控件渲染的图像必须知道下面文本中的第一个元音在哪里(第一个neume - 我们称之为音符 - 必须准确地放在第一个元音上方)。

我真的很难做到这一点。我考虑过使用RTB,但是重新调整大小存在整个问题 - 歌词的长度基本上可以是无限的 - (它向下重新调整大小,而不是向右),以及绑定到RTB真的很有趣

你能告诉我如何解决这个问题吗?这是一张小图片,解释了-我希望-我的问题。

http://img833.imageshack.us/img833/7451/clipboard01fd.png

非常感谢您!

4

1 回答 1

0

你看过 TextBox.GetRectFromCharacterIndex 方法吗?

http://msdn.microsoft.com/en-us/library/ms603094.aspx

如果我正确理解了您的问题,您应该能够在上面的示例中得到字母“O”的矩形。

我有一个类似的问题,我需要在给定文本框的装饰层上绘制“红色波浪线”来表示自定义拼写检查器解决方案(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);
      }

然后把那个矩形转换成屏幕坐标(或者你需要的任何坐标)

于 2013-07-11T17:08:26.123 回答