私が WPF で取り組んでいるアプリケーションの主な目的は、歌の歌詞を編集し、その上にギター コードを重ねて印刷できるようにすることです。
楽器を演奏しなくても、おそらくコードを見たことがあるでしょう。アイデアを与えるために、次のようになります。
E E6
I know I stand in line until you
E E6 F#m B F#m B
think you have the time to spend an evening with me
しかし、この醜い等幅フォントの代わりにTimes New Roman
、歌詞とコード (太字フォントのコード) の両方にカーニングを適用したフォントが必要です。そして、ユーザーがこれを編集できるようにしたい。
これは、 でサポートされているシナリオではないようですRichTextBox
。これらは、解決方法がわからない問題の一部です。
- コードの位置は、歌詞テキスト (またはより一般的に
TextPointer
は歌詞行) の特定の文字に固定されています。ユーザーが歌詞を編集するとき、コードが正しい文字の上に留まるようにします。例:
.
E E6
I know !!!SOME TEXT REPLACED HERE!!! in line until you
- 行の折り返し: 2 行 (1 行目は和音、2 行目は歌詞) は、折り返しに関しては論理的に 1 行です。単語が次の行に折り返されるとき、その上にあるすべてのコードも折り返されます。また、chord が単語をラップすると、それもラップします。例:
.
E E6
think you have the time to spend an
F#m B F#m B
evening with me
- コード同士が近すぎる場合でも、コードは正しい文字の上にとどまる必要があります。この場合、歌詞行に余分なスペースが自動的に挿入されます。例:
.
F#m E6
...you have the ti me to spend...
- 歌詞の行
Ta VA
と和音があるとしA
ます。のように見えない歌詞にしたい
。
V
2 番目の画像は と の間でカーニングされませんA
。オレンジ色の線は、効果を視覚化するためだけにあります (ただし、コードが配置される x オフセットを示します)。最初のサンプルを生成するために使用されるコードは<TextBlock FontFamily="Times New Roman" FontSize="60">Ta VA</TextBlock>
、2 番目のサンプルの と<TextBlock FontFamily="Times New Roman" FontSize="60"><Span>Ta V<Floater />A</Span></TextBlock>
です。
これを行う方法についてのアイデアはRichTextBox
ありますか? または、WPFでそれを行うより良い方法はありますか? サブクラス化Inline
またはRun
ヘルプしますか? アイデア、ハック、TextPointer
マジック、コード、または関連トピックへのリンクは大歓迎です。
編集:
この問題を解決するために2つの主要な方向性を探っていますが、どちらも別の問題につながるため、新しい質問をします:
RichTextBox
コードエディタに変えようとしています - How can I create subclass of class Inline? を見てください。.HB answerで提案されているように、
Panel
s es などの個別のコンポーネントから新しいエディターを構築します。これには多くのコーディングが必要であり、次の (未解決の) 問題も発生します。TextBox
- コンポーネントは、レイアウト位置に応じて幅/高さを変更します(行頭の空白の削除など)。
- カーニングは、コンポーネントの境界に手動で挿入する必要があります。
- RichTextBox を TextBlock のように見せる方法は? (エレガントなハックではありません/回避策は知られていません)
編集#2
Markus Hütter の質の高い回答RichTextBox
は、自分のニーズに合わせて微調整しようとしていたときに期待していたよりも多くのことができることを示しています。答えを詳細に調べる時間は今しかありません。Markus はRichTextBox
マジシャンかもしれませんが、私はこれを手伝う必要がありますが、彼の解決策には未解決の問題もいくつかあります。
- このアプリケーションは、「美しく」印刷された歌詞に関するものです。主な目標は、タイポグラフィの観点からテキストが完璧に見えるようにすることです。和音同士が近すぎたり重なったりする場合、Markus は、距離が十分になるまで、その位置の前に繰り返しスペースを追加することを提案しています。実際には、ユーザーが 2 つのコード間の最小距離を設定できるという要件があります。その最小距離は尊重されるべきであり、必要になるまで超えてはなりません。スペースの粒度が十分ではありません.必要な最後のスペースを追加すると、おそらく必要以上にギャップを広げるでしょう. カスタム width のスペースを挿入する必要があります。
- コードのない行 (テキストのみ) や、テキストのない行 (コードのみ) が存在する可能性があります。
LineHeight
ドキュメント全体に対して が または他の固定値に設定されている場合25
、和音のない行の上に「空の行」が表示されます。和音だけでテキストがない場合、それらのためのスペースはありません。
他にも小さな問題はありますが、解決できると思うか、重要ではないと考えています。とにかく、マーカスの答えは本当に価値があると思います-可能な方法を示すだけでなく、装飾者を使用RichTextBox
する一般的なパターンのデモンストレーションとしても。