становится ..
ная цель приложения, над которым я работаю в 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?.Создать новый редактор из отдельных компонентов, таких какPanel
s TextBox
и т. д., как предлагается вH.B. ответ, Это понадобитсямного кодирование, а также привело к следующим (нерешенным) проблемам:
Высококачественный ответ Маркуса Хюттера показал мне, что гораздо больше можно сделать сRichTextBox
потом я ожидал, когда попытался сам подстроить его под свои нужды. У меня было время, чтобы изучить ответ в деталях только сейчас. Маркус может бытьRichTextBox
волшебник, мне нужно помочь мне с этим, но есть некоторые нерешенные проблемы с его решением:
LineHeight
установлен в25
или другое фиксированное значение для всего документа, это приведет к тому, что строки без аккордов будут иметь «пустые строки» над ними. Когда есть только аккорды и нет текста, для них не будет места.Есть и другие мелкие проблемы, но я думаю, что могу их решить или считаю их не важными. В любом случае, я думаю, что ответ Маркуса действительно ценен - не только для того, чтобы показать мне возможный путь, но и для демонстрации общей схемы использования.RichTextBox
с обожателем.