considérations d'efficacité d'une approche à deux panneaux vs DrawingContext
J'ai de bonnes nouvelles pour vous: Vous avez tort au sujet de la perte de performance significative. Votre idée de deux canevas est presque optimale, même si vous utilisez des objets individuels pour les lignes de la grille. C'est parce que WPF utilise le rendu en mode retenu: Lorsque vous créez le canevas, tout ce qui y est est sérialisé dans une structure compacte au niveau natif. Cela ne change que lorsque vous modifiez les lignes de la grille d'une manière ou d'une autre, par exemple en modifiant l'espacement de la grille. Dans tous les autres cas, les performances seront indiscernables des méthodes de code managé les plus rapides possibles.
Une légère augmentation des performances pourrait être obtenue en utilisant DrawingContext
comme décrit par Nicholas.
plus simple et plus solution efficace
Peut-être une meilleure façon puis tracer des lignes individuelles sur la toile de la grille est d'utiliser deux brosses visuelles carrelés (horizontale, verticale) pour dessiner toutes les lignes unhilighted, puis utilisez Rectangle
(s) ajouté (s) dans code-behind pour hilight la ligne (s) que vous accrochez à. Le principal avantage de cette technique est que votre grille peut être effectivement infinie, il n'est donc pas nécessaire de calculer le bon nombre de lignes de la grille pour dessiner puis mettre à jour chaque fois que la fenêtre se redimensionne ou que le zoom change. Vous n'avez également que trois UIElements impliqués, plus un de plus pour chaque ligne de la grille qui est actuellement hilighted. Cela me semble aussi plus propre que de suivre les collections de lignes de la grille. La raison pour laquelle vous voulez utiliser deux pinceaux visuels est que le dessin est plus efficace: Le pinceau dessinant les lignes verticales est étiré sur une grande distance (par exemple double.MaxValue/2) dans le sens vertical pour que le GPU ne reçoive qu'un appel de dessin par ligne verticale, la même chose pour l'horizontal. Faire un carrelage à deux voies est beaucoup moins efficace.
couche Adorner
Depuis que vous avez demandé des alternatives, une autre possibilité est d'utiliser Adorner
et AdornerLayer
avec l'une des solutions ci-dessus plutôt que empiler votre toile en utilisant par exemple une grille ou contenant toile. Pour une application semblable à Paint, c'est bien parce que la couche adorner peut être au-dessus de votre couche graphique (s), mais les ornements peuvent toujours attacher à des éléments individuels qui sont affichés.
Je ne comprends pas vraiment votre idée avec 2 pinceaux visuels. Peux-tu être plus précis? Je ne savais même pas qu'il y avait un moyen d'utiliser 2 pinceaux visuels différents sur un seul panneau. – chrischu
Si vous utilisez ' ' vous pouvez le remplacer par ' 'pour dessiner deux rectangles chacun avec son propre pinceau visuel. HorizBrush sera transparent à l'exception d'une zone de largeur de la ligne de quadrillage en haut et VertBrush sera transparent à l'exception d'une zone de largeur de ligne de la grille à gauche. Viewport/Viewbox et la mosaïque seront définies de sorte que chaque pinceau soit répété à l'intervalle de ligne de quadrillage approprié dans la direction donnée, créant ainsi une grille. –
Notez qu'il peut y avoir des moyens plus efficaces pour effectuer la mise en page que d'utiliser un '' séparé. Par exemple, il peut exister un '' que vous pouvez partager, ou un '