2009-06-29 17 views
12

Noté que al anular el método System.Windows.Window OnRender no se dibuja en la pantalla. Estoy seguro de que hay una buena razón para esto, pero no pude encontrar la explicación.¿Por qué la anulación del método WPF Window.OnRender no se dibuja en la pantalla?

El código siguiente muestra esto:

using System; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace WpfApplication1 
{ 
    public partial class Window1 : Window 
    { 
     Pen pen = new Pen(); 

     public Window1() 
     { 
      InitializeComponent(); 
      pen.Brush = Brushes.Black; 
     } 

     protected override void OnRender(DrawingContext dc) 
     { 
      base.OnRender(dc); 
      dc.DrawRectangle(Brushes.Black, pen, new Rect(0, 0, 600, 400)); 
      dc.DrawEllipse(Brushes.Green, pen, new Point(300, 300), 50, 50); 
     } 
    } 
} 

sustituir la lógica de dibujo en un FrameworkElement (a continuación, establecer el elemento como el contenido de una ventana) funcionar bien.

gracias,

Danny

Respuesta

14

La respuesta está dada por Chales Petzold here.

Su respuesta es 'no sé por qué', sin embargo, un comentario sugiere correctamente que al establecer el fondo de la ventana para que se corrija se corrige el error.

+0

"no sé por qué" realmente no responde la pregunta, y este arreglo no funciona para derivados de ItemsControl que están usando MVVM – user3690202

0

al igual que un cheque, funciona el fragmento con las líneas dc.Draw... retirados (es decir, que es el acto de eludir o los comandos de dibujo adicionales que causan el problema)?

He encontrado un enlace que sugiere que simplemente cambiando el orden de las llamadas pueden resolver el problema (es decir, haciendo las llamadas antes de llamar dc.Draw...base.OnRender(dc)).

http://www.codeproject.com/Messages/3356653/Override-OnRender-class-inherits-frameworkelement.aspx

1

Creo que esa cuadrícula genera este problema. Porque ventana predeterminada contiene el elemento de cuadrícula

4

En realidad, la ventana se pinta a sí misma, que entre otros es un rectángulo para el fondo. Lo que se agrega en el OnRender está detrás del fondo. Haga que el fondo sea transparente y uno puede ver lo que hay detrás de él.

Al menos eso es lo que descubrí al usar Button y OnRender. Si dibujo solo dentro del botón, no se puede ver nada, porque el botón se dibuja sobre él. Pero si el dibujo se extiende más allá de los límites de los botones, se puede ver cualquier cosa afuera.

enter image description here

Aquí un botón vacío se dibuja sobre un fondo amarillo. En OnRender, dibujo 2 líneas negras formando una cruz. Pero solo se pueden ver las partes de la línea fuera del botón.

Comportamiento muy extraño de OnRender, de hecho!

Cuestiones relacionadas