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:
TextPointer
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
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 comoPanel
s TextBox
es etc., como sugerido em H.B. respond. Isso precisaria deMuito d codificação e também levou a seguintes problemas (não resolvidos):
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:
LineHeight
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.