visual tutorial studio ejemplos descargar arquitectura c# .net wpf

c# - tutorial - Adorno WPF con controles en el interior.



wpf vs winforms (2)

Estoy tratando de lograr un uso inusual de un Adorner. Cuando coloca el mouse sobre un RichTextBox, aparecerá un Adorner (vea el diagrama a continuación) sobre él, permitiéndole agregar una lista de cadenas a un ListBox contenido en el Adorner. Esto se usa para agregar "etiquetas" (a la Flickr) al pasaje contenido en el elemento adornado.


En primer lugar : ¿es esto posible?

La mayoría de los ejemplos de Adorners muestran cómo anular el método OnRender de Adorner para hacer cosas triviales como dibujar formas. Pude usar esto para representar un conjunto de rectángulos que crea el borde gris del Adorner, que también cambia de tamaño automáticamente si la altura de RichTextBox aumenta debido a la adición de texto de líneas adicionales mientras se muestra el Adorner.

protected override void OnRender(DrawingContext drawingContext) { SolidColorBrush grayBrush = new SolidColorBrush(); grayBrush.Color = Color.FromRgb(153, 153, 153); // left drawingContext.DrawRectangle(grayBrush, null, new System.Windows.Rect(1, 1, 5, ActualHeight)); // right drawingContext.DrawRectangle(grayBrush, null, new System.Windows.Rect(ActualWidth - 6, 1, 5, ActualHeight)); //bottom drawingContext.DrawRectangle(grayBrush, null, new System.Windows.Rect(1, ActualHeight, ActualWidth - 2, 5)); // for reasons unimportant to this example the top gray bar is rendered as part of the RichTextBox }

Sin embargo, agregar controles es un poco más problemático. En términos generales, el adorno de WPF requiere agregar controles secundarios en código en lugar de XAML. ¿Utilizando la técnica descrita en DrawingContext adorner - posible dibujar stackpanel? , He aprendido cómo agregar controles secundarios (como un TextBox) a un Adorner sin ningún problema dentro del inicializador de Adorner.

El problema, sin embargo, es la colocación de esos controles dentro del Adorner.

Si pudiera crear una cuadrícula con un fondo gris y colocarla en la parte inferior del Adorner, debería estar lista. Asumiría (espero) que cosas como el cambio de tamaño automático del Adorner en función del tamaño cambiante de la Cuadrícula a medida que se agregan las etiquetas, sucedan automáticamente.

En resumen, suponiendo que esto sea posible , ¿puede alguien recomendar una forma de crear este área de control de etiquetado inferior dentro del Adorner y colocarla en relación con la parte inferior del Adorner (que posiblemente tenga que cambiar el tamaño a medida que se redimensiona el contenido de RichTextBox)?


¡Huzah! Con la ayuda de Ghenadie Tanasiev , tengo una respuesta.

A diferencia de la mayoría de los controles en WPF, los adornos no tienen ninguna forma inmediata de asignar elementos secundarios (como los controles que quería agregar). Sin agregar nada a los adornadores, solo puede anular su método OnRender y dibujar cosas dentro del DrawingContext que se pasa a él. Para ser honesto, esto se ajusta probablemente al 99% de los casos de uso para adornadores (cosas como la creación de controles de arrastre alrededor de un objeto), pero necesitaba agregar algunos controles adecuados a mi Adorner.

El truco para hacer esto es crear una VisualCollection y establecer su adorno como su propietario al pasarlo al constructor de la colección.

Todo esto se describe de manera bastante completa en este artículo de blog . Desafortunadamente, mis repetidas búsquedas en Google no estaban convirtiendo este artículo hasta que supe que buscar VisualCollection , gracias a la guía de Ghenadie.

Esto no se menciona en el artículo, pero tenga en cuenta que es posible combinar la técnica VisualCollection junto con el dibujo en el método OnRender del adorno. Estoy usando OnRender para lograr los bordes laterales y superiores descritos en mi diagrama anterior y usando VisualCollection para colocar y crear los controles.

Edición: aquí está el código fuente de la publicación del blog mencionado ya que ya no está disponible:

public class AdornerContentPresenter : Adorner { private VisualCollection _Visuals; private ContentPresenter _ContentPresenter; public AdornerContentPresenter(UIElement adornedElement) : base(adornedElement) { _Visuals = new VisualCollection(this); _ContentPresenter = new ContentPresenter(); _Visuals.Add(_ContentPresenter); } public AdornerContentPresenter(UIElement adornedElement, Visual content) : this(adornedElement) { Content = content; } protected override Size MeasureOverride(Size constraint) { _ContentPresenter.Measure(constraint); return _ContentPresenter.DesiredSize; } protected override Size ArrangeOverride(Size finalSize) { _ContentPresenter.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); return _ContentPresenter.RenderSize; } protected override Visual GetVisualChild(int index) { return _Visuals[index]; } protected override int VisualChildrenCount { get { return _Visuals.Count; } } public object Content { get { return _ContentPresenter.Content; } set { _ContentPresenter.Content = value; } } }


No tiene que ensuciarse las manos, eche un vistazo a este artículo de CodeProject que he usado en el pasado.

Te permite definir adornos en XAML, hacer encuadernaciones, etc.