становится ..

ная цель приложения, над которым я работаю в 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-я с лирикой) - это логически одна строка, когда речь идет о переносе строк. Когда слово переносится на следующую строку, все аккорды, находящиеся над ним, также должны переноситься. Кроме того, когда аккорд обернет слово, что это над ним, также обернуть. Пример:

.

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 а такжеA, Оранжевые линии предназначены только для визуализации эффекта (но они отмечают смещения по x, где будет размещен аккорд). Код, использованный для создания первого образца:<TextBlock FontFamily="Times New Roman" FontSize="60">Ta VA</TextBlock> и для второго образца<TextBlock FontFamily="Times New Roman" FontSize="60"><Span>Ta V<Floater />A</Span></TextBlock>.

Любые идеи о том, как получитьRichTextBox сделать это ? Или есть лучший способ сделать это в WPF? Буду ли я подклассификацииInline или жеRun Помогите? Любые идеи, взломы,TextPointer магия, код или ссылки на смежные темы приветствуются.

Редактировать:

Я исследую 2 основных направления для решения этой проблемы, но оба приводят к другим проблемам, поэтому я задаю новый вопрос:

Пытаясь повернутьRichTextBox в редактор аккордов - посмотрите наКак я могу создать подкласс класса Inline?.

Создать новый редактор из отдельных компонентов, таких какPanels TextBoxи т. д., как предлагается вH.B. ответ, Это понадобитсямного кодирование, а также привело к следующим (нерешенным) проблемам:

Компоненты будут менять свою ширину / высоту в зависимости от положения макета. (удаление пробелов в начале строки и т. д.)Кернинг нужно будет вставить вручную на границах компонентов.Как сделать RichTextBox похожим на TextBlock? (не элегантный хак / обходной путь известен)Изменить # 2

Высококачественный ответ Маркуса Хюттера показал мне, что гораздо больше можно сделать сRichTextBox потом я ожидал, когда попытался сам подстроить его под свои нужды. У меня было время, чтобы изучить ответ в деталях только сейчас. Маркус может бытьRichTextBox волшебник, мне нужно помочь мне с этим, но есть некоторые нерешенные проблемы с его решением:

Это приложение будет все о "красиво" печатной лирике. Основная цель - чтобы текст выглядел идеально с типографской точки зрения. Когда аккорды расположены слишком близко друг к другу или даже перекрывают друг друга, Маркус предполагает, что яитеративно добавлять пробелы до его положения, пока их расстояние не будет достаточным. На самом деле существует требование, чтобы пользователь мог установить минимальное расстояние между двумя аккордами. Это минимальное расстояние должно соблюдаться и не превышаться до тех пор, пока это не будет необходимо. Пробелы недостаточно детализированы - как только я добавлю последнее необходимое пространство, я, вероятно, увеличу разрыв, чем необходимо - это сделает документ «плохим», я не думаю, что он может быть принят.Мне нужно было бы вставить пространство пользовательской ширины.Могут быть строки без аккордов (только текст) или даже строки без текста (только аккорды). когдаLineHeight установлен в25 или другое фиксированное значение для всего документа, это приведет к тому, что строки без аккордов будут иметь «пустые строки» над ними. Когда есть только аккорды и нет текста, для них не будет места.

Есть и другие мелкие проблемы, но я думаю, что могу их решить или считаю их не важными. В любом случае, я думаю, что ответ Маркуса действительно ценен - ​​не только для того, чтобы показать мне возможный путь, но и для демонстрации общей схемы использования.RichTextBox с обожателем.

Ответы на вопрос(2)

Ваш ответ на вопрос