visual tutorial studio que puede programacion presentacion hacer español ejemplos con animaciones c# .net wpf xaml graphics

c# - tutorial - wpf presentacion



¿Cómo dibujar en una ventana en WPF(mejor práctica)? (5)

Cuando hay demasiados objetos para dibujar muy rápidamente (gran Árbol Visual), otra opción sería usar un WriteableBitmap . Simplemente use la propiedad Pixels para establecer los píxeles y / o use el método Render para dibujar UIElements .

Intento escribir una pequeña aplicación similar a un juego interactivo, donde necesito tener un método Draw que vaya a dibujar en la pantalla, pero no puedo encontrar la manera de estructurar el método para WPF.

Si esto fuera Winforms , podría usar:

public void Draw (Graphics g) { }

Pero para una WPF Window , ¿qué debería tener en ella en el xaml (actualmente solo tengo una Grid ) y qué debería recibir este argumento como argumento?

Primero quiero hacerlo así para que funcione, luego puedo pensar en cómo hacerlo más WPF , etc. Pero ahora estoy más interesado en hacer que esto funcione.



Para implementar un comportamiento de tipo bucle de dibujo en WPF, puede usar el evento ComposiciónResumen.Rendering . Esto se levanta una vez por cuadro cuando el sistema de dibujo WPF está pintando cuadros.

Como otros han señalado, esto no es muy amigable para WPF, pero funcionará y se puede utilizar para obtener un comportamiento de dibujo más inmediato de una aplicación de WPF.

En la mayoría de los casos, usaría un lienzo de raíz único y actualizaría, por ejemplo, la posición del lienzo de un elemento en el evento ComposiciónResponder.Rendering.

Por ejemplo, para hacer que una elipse vuele por toda la pantalla, haz esto:

En su XAML (para una ventana que tiene un tamaño de 640 por 480):

<Canvas x:Name="theCanvas"> <Ellipse x:Name="theEllipse" Height="10" Width="10" Fill="Black" /> </Canvas>

En su código detrás de la ventana en el que se encuentra el XAML anterior (asegúrese de agregar una referencia a System.Windows.Media para ver el objeto CompsitionTarget:

public static Random rand = new Random(); public View() { InitializeComponent(); CompositionTarget.Rendering += CompositionTarget_Rendering; } void CompositionTarget_Rendering(object sender, System.EventArgs e) { double newLeft = rand.Next(0, 640); double newTop = rand.Next(0, 480); theEllipse.SetValue(Canvas.LeftProperty,newLeft); theEllipse.SetValue(Canvas.TopProperty, newTop); }


Por lo general, "dibuja" en WPF de una manera completamente diferente.

En Windows Forms / GDI, la API de gráficos es una API de gráficos de modo inmediato. Cada vez que la ventana se actualiza / invalida, dibuja explícitamente los contenidos usando Graphics.

En WPF, sin embargo, las cosas funcionan de manera diferente. Casi nunca dibujas directamente, sino que es una API de gráficos de modo retenido. Le dices a WPF dónde quieres los objetos y se encarga del dibujo por ti.

La mejor manera de pensarlo es, en Windows Forms, dirías "Dibuja una línea de X1 a Y1. Luego dibuja una línea de X2 a Y2. Luego ...". Y repite esto cada vez que necesite "volver a dibujar" ya que la pantalla se invalida.

En WPF, en cambio, dices "Quiero una línea de X1 a Y1. Quiero una línea de X2 a Y2". WPF luego decide cuándo y cómo dibujarlo para usted.

Esto se hace colocando las formas en un Lienzo, y luego dejando que WPF haga todo el trabajo duro.


Prefiero usar el método OnRender como en este ejemplo:

protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); drawingContext.DrawRectangle(null, new Pen(Brushes.Black, 2), new Rect(0, 0, ActualWidth, Height)); }