Dans WPF, comment puis-je déterminer si un contrôle est visible pour l'utilisateur?
Je suis l'affichage d'un très grand arbre avec beaucoup d'éléments qu'il contient. Chacun de ces éléments présente des informations à l'utilisateur par le biais de ses associés contrôle UserControl, et cette information doit être mise à jour toutes les 250 millisecondes, ce qui peut être très coûteux de tâche depuis que je suis également utiliser la réflexion pour l'accès à certaines de leurs valeurs. Ma première approche a été d'utiliser la IsVisible de la propriété, mais il ne fonctionne pas comme je l'espérais.
Est-il possible de déterminer si un contrôle est "visible" pour l'utilisateur?
Note: je suis déjà à l'aide de la IsExpanded propriété d'ignorer la mise à jour s'est effondré nœuds, mais certains nœuds ont+ de 100 éléments et ne peut pas trouver un moyen d'ignorer ceux qui sont à l'extérieur de la grille de la fenêtre d'affichage.
- Une fois, j'ai eu un problème similaire. Après avoir écrit le code pour détecter si un contrôle est visible, il s'est avéré que le code pour détecter a été plus lente qu'en fait la mise à jour du contrôle caché. Comparer vos résultats, car il pourrait ne pas être en vaut la peine.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser cette petite fonction d'aide j'ai juste écrit que va vérifier si un élément est visible pour l'utilisateur, dans un conteneur. La fonction renvoie
true
si l'élément est en partie visible. Si vous voulez vérifier si il est entièrement visible, remplacer la dernière ligne parrect.Contains(bounds)
.Dans votre cas,
element
sera votre contrôle de l'utilisateur, etcontainer
votre Fenêtre.ItemsContro.Items.Add(new ...)
), mais plutôt d'utiliser la liaison de données. Cependant, la liaison des données briser la hiérarchie visuelle que les enfants ajoutée à votre objet de données (par exemple,ObservableList
) de ne pas avoir un parent.TransformToAncestor
(ouTransformToVisual
) ne fonctionnera pas. Qu'allons-nous faire dans ce cas?!Utiliser ces propriétés pour le contrôle contenant:
puis connecter l'écoute de vos données de l'élément de INotifyPropertyChanged.PropertyChanged abonnés comme ce
Pour de plus amples informations, voir:
http://joew.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=cat%3DWPF
La accepté de répondre (et les autres réponses sur cette page) résoudre le problème spécifique que l'affiche originale a mais ils ne donnent pas une réponse adéquate à la question écrite dans le titre, c'est à dire, Comment faire pour déterminer si un contrôle est visible à l'utilisateur. Le problème est que Un contrôle qui est couvert par d'autres contrôles n'est pas visible même si elle peut être rendue et il est à l'intérieur des frontières de son conteneur, qui est ce que les autres réponses sont des problèmes pour les.
Pour déterminer si un contrôle est visible à l'utilisateur que vous avez parfois à être en mesure de déterminer si un WPF UIElement est Cliquable (ou de la souris accessible sur PC) par l'utilisateur
J'ai rencontré ce problème quand j'ai essayé de vérifier si un bouton de la souris cliqué par l'utilisateur. Un spécial scénario, ce qui m'énerve c'était qu'un bouton peut être réellement visible pour l'utilisateur, mais couvert avec quelques transparent ou semi transparent ou non transparente à tous) de la couche de prévenir les clics de souris. Dans de tels cas, un contrôle peut être visible pour l'utilisateur, mais pas accessible à l'utilisateur qui est en quelque sorte comme il n'est pas visible à tous.
J'ai donc dû venir avec ma propre solution.
MODIFIER - Mon premier post avait une autre solution utilisée InputHitTest méthode. Toutefois, il ne fonctionne pas dans de nombreux cas, et j'ai eu à le redessiner. Cette solution est beaucoup plus robuste et semble fonctionner très bien, sans faux-négatifs ou positifs.
Solution:
VisualTreeHelper.HitTest
sur tous ses angles (en Haut à gauche, en bas à gauche, en haut à droite, en bas à droite)VisualTreeHelper.HitTest
l'égalité de l'objet d'origine ou un visuel parent pour tous ses coins, et Partiellement Cliquable pour un ou plusieurs angles.Puis tout ce qui est nécessaire pour savoir si un bouton (par exemple) est cliquable est l'appel de: