Comment dessiner sur une Fenêtre WPF (meilleures pratiques)?
Je suis en train d'écrire un petit jeu interactif-comme application, où j'ai besoin d'avoir un Draw
méthode qui va dessiner sur l'écran, mais ne peut pas comprendre comment la structure de la méthode pour WPF.
Si c'était Winforms
, j'ai pu utiliser:
public void Draw (Graphics g)
{
}
Mais pour un WPF Window
, que dois-je avoir sur elle dans le xaml (actuellement seulement un Grid
), et ce qui devrait ce Draw
méthode recevoir comme argument?
D'abord je tiens à le faire de cette façon pour le faire fonctionner, alors je peux penser à la façon de la rendre plus WPF
, etc. Mais maintenant, je suis plus intéressé à obtenir que cela fonctionne.
- Pour tout à fait un dessin rapide dans WPF voir cet exemple complet stackoverflow.com/questions/16107877/fast-2d-graphics-in-wpf
Vous devez vous connecter pour publier un commentaire.
En général, vous "dessiner" dans WPF dans une manière complètement différente.
Dans les Windows Forms/GDI, l'API graphique est un mode immédiat API graphique. Chaque fois que la fenêtre est actualisé/invalidé, vous attire expressément le contenu à l'aide de Graphiques.
Dans WPF, cependant, les choses sont différentes. Vous rarement jamais dessiner directement - au lieu de cela, c'est un mode retenu API graphique. Vous dites WPF où vous voulez que les objets, et il prend soin de le dessin pour vous.
La meilleure façon de le penser il est, dans les Windows Forms, vous auriez du dire "Tracez une ligne à partir de X1 et Y1. Puis tracez une ligne à partir de X2 et Y2. Alors ...". Et vous répétez cette opération chaque fois que vous devez à "redessiner" depuis l'écran est invalidé.
Dans WPF, au lieu de cela, vous dites "je veux une ligne de X1 et Y1. Je veux une ligne de X2 Y2." WPF puis de décider quand et comment le dessiner pour vous.
Ceci est fait en plaçant les formes sur une Toile, et de laisser ensuite WPF faire tout le travail dur.
Line
objets, mais il se plaint que je peux pas faire à l'extérieur de la STA. Ne sont pasLine
objets indépendants à partir de l'INTERFACE utilisateur jusqu'à ce que je ajouter? Je veux juste créer dis 1000 d'entre eux et de passer ensuite à la toile à l'aide de l'expéditeur, au lieu d'appeler le Répartiteur 1000 fois.LineGeometry
au lieu deLine
? Je veux seulement comme des formes, et non cliquable contrôles. Je vois, il y a des formes comme desLine
,Ellipse
, mais ils ont aussiLineGeometry
etEllipseGeometry
types. Connaissez-vous la différence entre eux?Path
instance. Si les lignes de toutes les propriétés de partage (c'est à dire: une seule couleur, etc), vous pouvez mettre beaucoup deLineGeometry
instances dans unPath
, et en tirer lesPath
. Si ils sont tous de couleurs différentes largeurs/etc, alors il suffit d'utiliser la Ligne.LineGeometry
puis, ils sont tous de la même couleur, épaisseur, etc. Mais estLineGeometry
un élément de l'INTERFACE utilisateur commeLine
? Aussi ce pourrait augmenter la vitesse de mon application, à droite? Étant donné que je vais avoir 1LineGeometry
au lieu deLine
, droit?Quand il y a juste trop d'objets à tirer très rapidement (Visuel énorme Arbre) une autre option serait d'utiliser un
WriteableBitmap
. Utilisez simplement lePixels
de propriété pour définir les pixels et/ou de l'utilisation de laRender
méthode pour dessinerUIElements
.J'préférez utiliser la méthode OnRender comme dans cet exemple:
DrawingContext
pour un contrôle de tirage pour que l'arrière-plan du contrôleDe mettre en Œuvre un Tirage au sort de la boucle type de comportement dans WPF, vous pouvez utiliser le CompositionTarget.Le rendu événement. Ce est soulevée une fois par image lors de la WPF dessin du système est la peinture des cadres.
Comme d'autres l'ont souligné, ce n'est pas très WPF sympa, mais il va travailler et peut être utilisé pour obtenir plus immédiate dessin le comportement d'une application WPF.
Dans la plupart des cas, vous devriez utiliser une unique racine de la toile et de la mise à jour de dire la Toile de la position d'un élément sur la CompositionTarget.Le rendu de l'événement.
Par exemple pour faire une ellipse à la mouche sur l'écran ce faire:
Dans votre XAML (Pour une Fenêtre qui est de 640 par 480 taille):
Dans votre Code derrière la Fenêtre ci-dessus XAML est dans (assurez-vous d'ajouter une référence à System.De Windows.Les médias afin de voir les CompsitionTarget objet :
Yow convient d'en ajouter une Toile (ou de modifier la Grille pour une Toile) et ensuite tirer sur elle. Voici Microsoft tut sur le dessin sur une toile
Aussi, je ne sais pas comment connexes est cette autre question à la vôtre, mais vous pourriez vouloir vérifier.