3

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 に答える