Comment dessiner sur une fenêtre dans WPF (meilleure pratique)?

J’essaie d’écrire une petite application interactive ressemblant à un jeu, où je dois avoir une méthode Draw qui va dessiner à l’écran, mais je ne peux pas comprendre comment structurer la méthode pour WPF.

Si c’était Winforms , je pourrais utiliser:

 public void Draw (Graphics g) { } 

Mais pour une WPF Window , qu’est-ce que je devrais avoir dessus dans le xaml (ne disposer actuellement que d’une Grid ), et que cette méthode Draw devrait-elle recevoir comme argument?

D’abord, je veux le faire comme ceci pour le faire fonctionner, ensuite je peux penser à comment le rendre plus WPF , etc. Mais maintenant, je suis plus intéressé à obtenir que cela fonctionne.

En règle générale, vous “dessinez” dans WPF d’une manière complètement différente.

Dans Windows Forms / GDI, l’API graphique est une API graphique en mode immédiat. Chaque fois que la fenêtre est actualisée / invalidée, vous dessinez explicitement le contenu à l’aide de Graphics.

Dans WPF, cependant, les choses fonctionnent différemment. Vous dessinez rarement rarement directement – à la place, c’est une API graphique en mode conservé. Vous indiquez à WPF où vous voulez les objects et il s’occupe du dessin pour vous.

Dans Windows Forms, la meilleure façon de penser est de dire “Tracez une ligne de X1 à Y1. Tracez ensuite une ligne de X2 à Y2. Alors …”. Et vous le répétez chaque fois que vous devez “redessiner” car l’écran est invalidé.

Dans WPF, au lieu de cela, vous dites “je veux une ligne de X1 à Y1. Je veux une ligne de X2 à Y2”. WPF décide alors quand et comment le dessiner pour vous.

Ceci est fait en plaçant les formes sur un canevas, puis en laissant WPF effectuer tout le travail difficile.

Quand il y a trop d’objects à dessiner très rapidement (énorme Visual Tree), une autre option serait d’utiliser un WriteableBitmap . Utilisez simplement la propriété Pixels pour définir les pixels et / ou utilisez la méthode Render pour dessiner des UIElements .

Je préférerais utiliser la méthode OnRender comme dans cet exemple:

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

Pour implémenter un comportement de type de boucle Draw dans WPF, vous pouvez utiliser l’événement CompositionTarget.Rendering . Ceci est relevé une fois par image lorsque le système de dessin WPF peint des images.

Comme d’autres l’ont déjà fait remarquer, ce n’est pas très convivial avec WPF, mais cela fonctionnera et pourra être utilisé pour obtenir un comportement de dessin plus immédiat d’une application WPF.

Dans la plupart des cas, vous utiliseriez un canevas racine unique et metsortingez à jour la position du canevas d’un élément dans l’événement CompositionTarget.Rendering.

Par exemple, pour faire voler une ellipse sur l’écran, procédez comme suit:

Dans votre XAML (pour une fenêtre dont la taille est de 640 x 480):

    

Dans votre code derrière la fenêtre dans laquelle se trouve le XAML ci-dessus (veillez à append une référence à System.Windows.Media afin de voir l’object 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); } 

Vous devez append un canevas (ou changer la grid pour un canevas), puis dessiner dessus. Voici Microsoft tut sur le dessin sur une canvas

De plus, je ne sais pas dans quelle mesure cette autre question est liée à la vôtre, mais vous voudrez peut-être vérifier.