J'ai un contrôle du WPF complexe qui attire beaucoup de primitives dans son tingent (c'est une sorte de carte). Lorsqu'une petite partie de celle-ci change, je voudrais seulement réinitialiser des commandes de rendu des éléments affectés, au lieu d'exploiter l'onRender entier. Bien que je vais bien avec la performance de ma fonction OnRender sur un redimensionnement ou peu importe, ce n'est pas assez rapide pour la surbrillance de la souris basée sur la souris sur les primitives. P>
Actuellement, la seule façon de savoir comment forcer une mise à jour d'écran consiste à appeler InvalidateVisual (). Aucun moyen d'envoyer dans une région rectoculée sale pour invalider. P>
est la granularité la plus faible de la composition de l'écran WPF l'élément UI? Aurai-je besoin de faire mes rendus de primitives dans une cible intermédiaire, puis d'utiliser invalidateVisual () à mettre à jour à l'écran? P>
3 Réponses :
WPF ne fonctionne pas assez comme ça, afin que vous ne puissiez pas invalider les régions. Cependant, certaines optimisations peuvent être apportées. Il y a une mesure, arrangez, puis rendu passe. Si un contrôle se déplace, mais ce qui rend effectivement change, vous pouvez dire WPF de ne faire que le passage d'arrangement. Vous pouvez déclencher ces invalidations hors des modifications de la valeur de la propriété de dépendance avec FrameformProperTymetaData et FrameformProperTyTataDataMtions ( http://msdn.microsoft.com/en-us/library/system.windows.frameworkProperTymetaDataPtionS.aspx ). P>
Lorsque vous souhaitez écrire des commandes personnalisées / composites WPF, vous devez essayer d'éviter de remplacer l'onRender le plus possible, en particulier si vous envisagez d'invalider les portions de celui-ci. Il est beaucoup plus facile d'utiliser AddVisualChild + Supprimer Visualchildrencount + Supprimer GetVisualChild + Supprimer Mesurez et arrangez comme ceci (pseudo code avec 2 enfants): avec ce type de code, vous pouvez invalider une seule partie , avec quelque chose comme Subcontrolx.invalidatexxx (); P> P>
MESURECORE CODE> ET
CORECORE CODE> ne sont pas remplacés. Peut-être que vous vouliez dire
Measeverride code> et
arrenseoverride code> à la place?
@Dotnet - Cela dépend si vous dérivez de l'uielement ou de l'établissement
Vous ne devriez pas utiliser WPF est un retenu em> système de dessin. Cela signifie Pour mettre à jour une partie de votre UI ultérieurement, enveloppez ces commandes dans un C'est à quoi cela ressemble: p> < Pré> xxx pré> p> invalidaisvisual () code> sauf si la taille de votre contrôle change, car elle provoque une réintégrée assez coûteuse de votre UI.
onRender () code> pourrait mieux être appelé
accumulésrawingObjects () code>. Il accumule réellement un arbre d'objets de dessin en direct, ce qui n'a besoin que de se produire une fois par mise en page. Il utilise ensuite ces objets pour dessiner votre interface utilisateur chaque fois que cela doit. Pour modifier la manière dont une partie de votre UI ressemble sans ré-mise en page, certains objets (comme Drawinggroup, Rendertargetbitmap et WriterAbitMap) peuvent être mis à jour après
OnRender () Code>, à tout moment. P>
Drawinggroup CODE> et mettez cet objet em> dans le "code> DrawingContext code>. Ensuite, vous pouvez
Ouvrir () CODE> et le mettre à jour quand vous le souhaitez, et WPF repeindre automatiquement la partie de l'interface utilisateur. P>
Ouvrez-vous Uielement.Enrender pour tout attirer à l'intérieur de l'uielement ou l'élément a-t-il encore des enfants visuels normaux?