rie editor de acordes de guitarra no WPF (de RichTextBox

principal objetivo da aplicação em que estou trabalhando no WPF é permitir a edição e, consequentemente, a impressão de letras de músicas com acordes de guitarr

Você provavelmente já viu acordes, mesmo que não toque nenhum instrumento. Para se ter uma idéia, é assim:

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

Mas, em vez dessa fonte feia de espaço mono, eu quero terTimes New Roman fonte com kerning para letras e acordes (acordes em negrito). E eu quero que o usuário possa editar isso.

Este não parece ser o cenário suportado paraRichTextBox. Estes são alguns dos problemas que não sei resolver:

Os acordes têm suas posições fixas sobre algum caractere no texto da letra (ou mais geralmenteTextPointer da linha da letra). Quando o usuário edita a letra, eu quero que o acorde fique com o personagem certo. Exemplo

.

E                                       E6
I know !!!SOME TEXT REPLACED HERE!!! in line until you
Quebra automática de linhas: 2 linhas (1ª com acordes e 2ª com letras) são logicamente uma linha quando se trata de quebra automática. Quando uma palavra passa para a próxima linha, todos os acordes acima dela também devem ser quebrados. Além disso, quando o acorde envolve a palavra que está sobre ele, também o envolve. Exemplo

.

E                  E6
think you have the time to spend an
F#m            B F#m B
evening with me
s acordes @ devem permanecer com o caráter correto, mesmo quando os acordes estão muito próximos um do outro. Nesse caso, algum espaço extra é inserido automaticamente na linha da letra. Exemplo

.

                  F#m E6
  ...you have the ti  me to spend... 
Dizer que eu tenho letras de linhaTa VA e acorde sobreA. Quero que a letra pareça não parece. A segunda imagem não está definida entreV eA. Linhas alaranjadas existem apenas para visualizar o efeito (mas marcam x deslocamentos onde o acorde seria colocado). O código usado para produzir a primeira amostra é<TextBlock FontFamily="Times New Roman" FontSize="60">Ta VA</TextBlock> e para a segunda amostra<TextBlock FontFamily="Times New Roman" FontSize="60"><Span>Ta V<Floater />A</Span></TextBlock>.

Alguma idéia de como obterRichTextBox para fazer isso ? Ou existe uma maneira melhor de fazer isso no WPF? Vou subclassificarInline ouRun Socorro? Alguma idéia, hacks,TextPointer código, mágica ou links para tópicos relacionados são bem-vindo

Editar

Estou explorando duas direções principais para resolver esse problema, mas ambas levam a outros problemas, então faço uma nova pergunta:

Tentando ativarRichTextBox no editor de acordes - Dê uma olhada noComo posso criar uma subclasse da classe Inline?.

Crie um novo editor a partir de componentes separados comoPanels TextBoxes etc., como sugerido em H.B. respond. Isso precisaria deMuito d codificação e também levou a seguintes problemas (não resolvidos):

Os componentes mudarão sua Largura / Altura de acordo com a posição do layoutremoção de espaço em branco no início da linha, etcKerning terá que ser inserido manualmente nos limites dos componentes.Como fazer o RichTextBox parecer com TextBlock? (hack / solução alternativa não é conhecida) Editar # 2

esposta de alta qualidade de @Markus Hütter me mostrou que muito mais pode ser feito comRichTextBox então eu esperava quando estava tentando ajustá-lo para minhas necessidades. Só tive tempo de explorar a resposta em detalhes agora. Markus pode serRichTextBox mágico Eu preciso me ajudar com isso, mas também existem alguns problemas não resolvidos com sua solução:

Esta aplicação será sobre letras impressas "lindamente". O objetivo principal é que o texto pareça perfeito do ponto de vista tipográfico. Quando os acordes estão muito próximos um do outro ou mesmo sobrepostos, Markus sugere que euiterativamente adicione espaços adicionais antes de sua posição até que a distância seja suficiente. Na verdade, é necessário que o usuário possa definir a distância mínima entre 2 acordes. Essa distância mínima deve ser respeitada e não excedida até que seja necessário. Os espaços não são granulares o suficiente - quando eu adicionar o último espaço necessário, provavelmente aumentarei a diferença do que o necessário - que fará com que o documento pareça "ruim". Acho que não poderia ser aceito. Eu precisaria inserir espaço de largura personalizada. Pode haver linhas sem acordes (apenas texto) ou mesmo linhas sem texto (apenas acordes). QuandoLineHeight está configurado para25 ou outro valor fixo para todo o documento, as linhas sem acordes terão "linhas vazias" acima deles. Quando houver apenas acordes e nenhum texto, não haverá espaço para ele

Existem outros problemas menores, mas acho que posso resolvê-los ou considero que não são importantes. De qualquer forma, acho que a resposta de Markus é realmente valiosa - não apenas por me mostrar o caminho a percorrer, mas também como uma demonstração do padrão geral de uso deRichTextBox com adorner.

questionAnswers(2)

yourAnswerToTheQuestion