7
votes

Possible d'invalider visual () sur une région donnée au lieu de tout contrôle WPF?

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.

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.

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?


1 commentaires

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?


3 Réponses :


0
votes

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 ).


0 commentaires

3
votes

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): xxx

avec ce type de code, vous pouvez invalider une seule partie , avec quelque chose comme Subcontrolx.invalidatexxx ();


2 commentaires

MESURECORE ET CORECORE ne sont pas remplacés. Peut-être que vous vouliez dire Measeverride et arrenseoverride à la place?


@Dotnet - Cela dépend si vous dérivez de l'uielement ou de l'établissement



0
votes

Vous ne devriez pas utiliser invalidaisvisual () sauf si la taille de votre contrôle change, car elle provoque une réintégrée assez coûteuse de votre UI.

WPF est un retenu système de dessin. Cela signifie onRender () pourrait mieux être appelé accumulésrawingObjects () . 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 () , à tout moment.

Pour mettre à jour une partie de votre UI ultérieurement, enveloppez ces commandes dans un Drawinggroup et mettez cet objet dans le "code> DrawingContext . Ensuite, vous pouvez Ouvrir () et le mettre à jour quand vous le souhaitez, et WPF repeindre automatiquement la partie de l'interface utilisateur.

C'est à quoi cela ressemble: < Pré> xxx


0 commentaires