我正在尝试创建一个neume(gregorian chant)编辑器。我已经做了很多,但是在乐谱下我被卡在了歌词的主题上。
基本上我要解决的问题是:有一些独立的用户控件块。在它们下面应该有文字区域来放置歌词。重点是 - 歌词是富文本(但只有文本 - 没有表格,图像等)。
为了让事情变得更有趣 - 我的用户控件呈现的图像必须知道下面文本中的第一个元音(第一个 neume - 让我们称之为注意 - 必须放在第一个元音上方。
我真的在努力完成它。我考虑过使用RTB
,但是重新调整大小的问题就存在 - 歌词基本上可以无限长 - (它向下重新调整大小,而不是向右调整),以及绑定到{{ 1}}真的是搞笑交易。
您能否告诉我如何解决这个问题?这是一个小图片,解释 - 我希望 - 我的问题。
非常感谢你!
答案 0 :(得分:0)
你看过TextBox.GetRectFromCharacterIndex方法了吗?
http://msdn.microsoft.com/en-us/library/ms603094.aspx
如果我正确理解你的问题,你应该能够在上面的例子中得到字母“O”的矩形。
我有一个类似的问题,我需要在给定文本框的adorner层上绘制“红色波浪形”来表示自定义拼写检查器解决方案(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);
}
然后把那个矩形转换成屏幕坐标(或者你需要的任何坐标)