Crear editor de acordes de guitarra en WPF (¿de RichTextBox?)
El objetivo principal de la aplicación en la que estoy trabajando en WPF es permitir la edición y, en consecuencia, la impresión de letras de canciones con acordes de guitarra sobre ella.
Probablemente haya visto acordes incluso si no toca ningún instrumento. Para darle una idea, se ve así:
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
Pero en lugar de esta fuente espaciada y fea, quiero tenerTimes New Roman
fuente con interletraje para letras y acordes (acordes en negrita). Y quiero que el usuario pueda editar esto.
Esto no parece ser un escenario compatible paraRichTextBox
. Estos son algunos de los problemas que no sé cómo resolver:
TextPointer
de la línea de letras). Cuando el usuario edita la letra, quiero que el acorde permanezca sobre el carácter correcto. Ejemplo.
E E6
I know !!!SOME TEXT REPLACED HERE!!! in line until you
Ajuste de línea: 2 líneas (1 con acordes y 2 con letras) son lógicamente una línea cuando se trata de ajustar. Cuando una palabra se ajusta a la siguiente línea, todos los acordes que están sobre ella también deben ajustarse. Además, cuando el acorde envuelve la palabra que se acabó, también se envuelve. Ejemplo.
E E6
think you have the time to spend an
F#m B F#m B
evening with me
Chords debe permanecer sobre el personaje correcto incluso cuando los acordes están demasiado cerca uno del otro. En este caso, se inserta automáticamente un espacio extra en la línea de letras. Ejemplo.
F#m E6
...you have the ti me to spend...
Di que tengo línea de letrasTa VA
y acorde sobreA
. Quiero que la letra se vea como no como. La segunda imagen no tiene kerning entreV
yA
. Las líneas naranjas solo están ahí para visualizar el efecto (pero marcan x desplazamientos donde se colocarían los acordes). El código utilizado para producir la primera muestra es<TextBlock FontFamily="Times New Roman" FontSize="60">Ta VA</TextBlock>
y para la segunda muestra<TextBlock FontFamily="Times New Roman" FontSize="60"><Span>Ta V<Floater />A</Span></TextBlock>
. Cualquier idea sobre cómo obtenerRichTextBox
para hacer esto ? ¿O hay una mejor manera de hacerlo en WPF? ¿SubclasificaréInline
oRun
¿ayuda? Cualquier idea, hacks,TextPointer
magic, código o enlaces a temas relacionados son bienvenidos.
Estoy explorando 2 direcciones principales para resolver este problema, pero ambas conducen a otros problemas, así que hago una nueva pregunta:
Intentando convertirRichTextBox
en el editor de acordes - Echa un vistazo a ¿Cómo puedo crear una subclase de clase Inline?.Build nuevo editor de componentes separados comoPanel
s TextBox
es etc. como se sugiere enMEDIA PENSIÓN. responde. Esto necesitaríaun montón d codificación y también condujo a los siguientes problemas (sin resolver):
espuesta de alta calidad de @Markus Hütter me ha demostrado que se puede hacer mucho más conRichTextBox
entonces esperaba cuando estaba tratando de ajustarlo para mis necesidades. He tenido tiempo de explorar la respuesta en detalles solo ahora. Markus podría serRichTextBox
mago Necesito ayudarme con esto, pero también hay algunos problemas sin resolver con su solución:
LineHeight
se establece en25
u otro valor fijo para todo el documento hará que las líneas sin acordes tengan "líneas vacías" encima de ellas. Cuando solo hay acordes y no hay texto, no habrá espacio para ellos. Hay otros problemas menores, pero creo que puedo resolverlos o considero que no son importantes. De todos modos, creo que la respuesta de Markus es realmente valiosa, no solo por mostrarme el camino posible, sino también como una demostración del patrón general de uso deRichTextBox
con adorno.