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:

os @Chords tienen sus posiciones fijas sobre algún personaje en el texto de la letra (o más generalmenteTextPointer 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.

Editar

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 comoPanels TextBoxes 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):

Componentes cambiarán su Ancho / Altura de acuerdo con la posición del diseño (eliminación de espacios en blanco al comienzo de la línea, etc.)Kerning deberá insertarse manualmente en los límites de los componentes. ¿Cómo hacer que RichTextBox se parezca a TextBlock? (no se conoce un truco / solución elegante) Editar # 2

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:

Esta aplicación tendrá que ver con letras impresas "maravillosamente". El objetivo principal es que el texto se vea perfecto desde el punto de vista tipográfico. Cuando los acordes están demasiado cerca uno del otro o incluso se superponen, Markus sugiere que yoiterativamente agregar espacios de suma antes de su posición hasta que su distancia sea suficiente. En realidad, se requiere que el usuario pueda establecer una distancia mínima entre 2 acordes. Esa distancia mínima debe respetarse y no superarse hasta que sea necesario. Los espacios no son lo suficientemente granulares: una vez que agregue el último espacio necesario, probablemente amplíe el espacio más de lo necesario, lo que hará que el documento se vea 'malo'. No creo que pueda aceptarse. @ Necesitaría insertar un espacio de ancho personalizado. Podría haber líneas sin acordes (solo texto) o incluso líneas sin texto (solo acordes). CuandoLineHeight 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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta