2011-04-27 12 views
6

En WPF me gustaría crear la implementación personalizada Inline. De la documentación de Inline: "Una clase abstracta que proporciona una base para todos los elementos de contenido de flujo en línea". Las clases como Figure, Run o Span heredan de Inline.¿Cómo puedo crear una subclase de clase Inline? (el utilizado en FlowDocument)

Mi clase personalizada que hereda de Inline sería algo así como '2 alineado ejecutar'. Tengo necesidades especiales para el flujo de documentos y esta parece ser la única forma. Sin embargo, no sé por dónde empezar: Inline ¡no define ningún miembro! Es una clase abstracta, por lo que debe ser heredada pero no hay documentación sobre cómo heredar de ella. No en MSDN y en ningún otro lugar donde pude encontrarlo.

Si puede proporcionar algunos recursos en línea (tutorial/blog/artículo) o ejemplos de código sobre cómo crear la subclase de Inline. Por ejemplo, solo una caja vacía de algún ancho y alto.

Si desea saber por qué quiero crear un elemento Inline personalizado, eche un vistazo a la pregunta Create guitar chords editor in WPF.

+0

Si puede proporcionar un enlace al código fuente de 'Run' o' Span' que también sería extremadamente útil. – drasto

+0

puede usar Reflector para ver el código –

+0

@Thomas Levesque: Iba a hacerlo, pero tomará un tiempo porque nunca antes había usado reflector. Tendré que instalarlo y descubrir cómo usarlo. – drasto

Respuesta

2

Las clases base se pueden utilizar con el solo propósito de agregar fidelidad de tipo. Por ejemplo, el código en un procesador FlowDocument posible que quieran hacer un código como:

if(currentElement is Inline) 
{ 
    // Do something 
} 

en línea en realidad no tiene que hacer nada en absoluto.

En cuanto a la subclase de Inline, creo que es posible que no pueda lograr lo que desea. Tengo entendido que el renderizador FlowDocument es responsable de observar los tipos de elementos e interpretar cómo se comportan a partir de su tipo y sus propiedades. En otras palabras, no tiene conocimiento de su código personalizado. Creo que lo mejor que puedes hacer es crear una subclase de un elemento útil y hacer que tu subclase se meta con los valores de las propiedades o cualquier cosa que sea invalidable.

También puede agregar propiedades adjuntas y procesar elementos secundarios que definan esas propiedades. Por ejemplo, si desea un contenedor de hipervínculo para permitir que diferentes elementos secundarios proporcionen enlaces diferentes, puede crear una subclase de hipervínculo, definir una nueva propiedad adjunta de enlace y manejar los eventos de clic para los hijos de forma diferente que el hipervínculo.

También es posible que tenga éxito con los elementos InlineUIContainer y BlockUIContainer, que le permiten insertar cualquier UIElement dentro de él, incluidos los UIElements personalizados.

+0

Me temo que las propiedades adjuntas no me ayudarán; estoy intentando ** influir en el diseño y el comportamiento del texto **. Y ese texto se comportará como texto en el documento solo si no está en ningún bloque (por lo que no 'InlineUIContainer' con 'UIElements' personalizados o' BlockUIContainer' son la solución correcta). Especialmente la selección de texto considerará que todo el 'InlineUIContainer' o' BlockUIContainer' es un elemento. Para más detalles, consulte mi pregunta [Crear editor de acordes de guitarra en WPF] (http://stackoverflow.com/questions/5796457/create-guitar-chords-editor-in-wpf-from-richtextbox) y preguntas vinculadas allí. – drasto

+1

Creo que puede que no tenga suerte con esto. Si encuentra una solución, por favor, comparta. –

+0

Podría ...Los chicos de WPF que diseñaron 'FlowDocument' parecen olvidarse de los guitarristas :(. Casi siempre hay una solución con lenguajes de programación como C#. Puede que sea incómodo, como reescribir la mitad de WPF. Esta vez parece que tendré que escribir algo mi propio 'FlowDocument' y' RichTextBox' hasta cierto punto: ((( – drasto

Cuestiones relacionadas