Pour la journalisation des actions utilisateur dans mes formulaires WPF, j'ai ajouté des gestionnaires d'événements globaux p>
Je veux me connecter exactement quel contrôle Fire l'événement, existe-t-il un identifiant unique pour un WPF uielement code> comme clientId dans asp.net? p>
7 Réponses :
Vous cherchez simplement à ajouter un nom code> ou
x: nom code> de sorte que la fenêtre
code> /
usercontrol code> /
page code> expose la commande au reste de la classe avec le nom spécifié.
<Window ...>
<Grid>
...
<!-- These controls are named, so you can access them directly by name -->
<Button x:Name="btnMyNamedButton" ... />
<Button Name="btnMyOtherNamedButton" ... />
<!-- This control is not named, so you can not directly access it by name -->
<Button ... />
<Grid>
</Window>
public partial class MyWindow : Window
{
public MyWindow()
{
InitializeComponent();
//btnMyNamedButton can be accessed
//btnMyOtherNamedbutton can also be accessed
//The third button can be accessed, but not directly by name.
}
}
Merci de répondre à la réponse @MY, mais le nom n'est pas ce que je cherche, je ne veux d'abord pas donner le nom de tous les contrôles d'interface utilisateur de manière excursive pour la journalisation, et une seconde, il peut être impossible pour une grille avec beaucoup de commandes d'édition dans la cellule Modèles ...
Pourquoi n'utilisez-vous pas le code de hachage? P>
Vous pouvez comparer les valeurs pour vous assurer qu'ils sont le même objet, et il est facile de les obtenir avec Évidemment, c'est différent chaque fois que vous exécutez le programme, il est donc en réalité une mauvaise idée, sauf si vous souhaitez mettre à jour le journal chaque fois que le processus est enregistré. Toujours possible mais p>
Je veux dire que vous pourrait em> stocker une valeur de hachage pour chaque objet au moment de la création du journal, mais je ne sais pas si j'aime ça p> .gethashcode () code> p>
Modifier H1>
J'ai testé et le problème est que le gethashcode () n'est que pour cette session. Si vous éteignez l'application vers le bas et que vous redémarrez, les éléments UI obtiendront tous de nouveaux hachons. Mais toujours +1.
@Exitmusic, gethascode sera modifié au moins après la reprise de l'application, ce qui rendra logique inutilisable ... Je veux avoir un identifiant plus stable
Je crois, pour la journalisation des actions de l'utilisateur, vous pouvez utiliser le arborescence de l'uautomation A> et le AutomationElement.AutomationID Propriété, parce que cette approche est prise en charge dans tous les contrôles d'interface utilisateur standard par défaut. De nombreux contrôles tiers prennent également en charge l'automatisé pour leurs éléments (par exemple les cellules de grille). Un automatisé est utile pour créer des scripts d'automatisation de test. p>
Hmmmm ... semble que l'automatisé doit être défini aussi, et s'il n'est pas défini, il renvoie le nom qui est vide dans notre cas ... Je suppose qu'aucun moyen de faire ce que je cherche ...
Une façon, vous pouvez le faire est avec un attribut personnalisé. Comme ...
Le alors vous avez besoin de la classe d'attributs personnalisée maintenant dans votre code, vous pouvez faire quelque chose comme ceci: p> parce que vous marquez le contrôle avec un attribut Dans le code, l'identifiant unique ne change jamais, quel que soit le nombre de fois que vous tuez / lancez l'application. P> Bien sûr, il s'agit d'un exemple de base qui montre comment accéder à l'ID, mais vous voudrez probablement utiliser un type de programmation orientée forme. Je fais exactement ce genre de chose à l'aide d'intercepteurs de château Windsor, mais cela est hors de portée de ce post. P> Idéalement, vous accéderez à cet identifiant lorsqu'il y a une sorte d'événement qui est tiré. Utilisation des intercepteurs vous permet d'utiliser des appels de méthode de capture avant d'être invoqués dans lequel vous pouvez rechercher l'identifiant comme indiqué ci-dessus et connectez-vous l'action. Alternativement, vous pouvez simplement utiliser P> uielement code> Vous souhaitez enregistrer (userControl par exemple): p>
this.GetCustomAttributes(...)
Pourquoi j'ai besoin d'un attribut? Je peux définir toutes les propriétés de noms de mes éléments d'UI, je veux juste trouver un moyen sans rien définir, car il est possible dans Winform
semble que j'ai trouvé la réponse à ma question, la réponse est non, maintenant de faire cela, comme indiqué dans MSDN ici (http://msdn.microsoft.com/en-us/magazine/ddd483216.aspx)<< p>
Notez que la définition de contrôle de la fenêtre de haut niveau ne contient pas de Attribut de noms. Ceci est significatif car, comme nous verrons bientôt, Lorsque vous écrivez l'automatisation des tests, un moyen facile d'obtenir une référence à un Le contrôle à l'aide de la bibliothèque Muia consiste à accéder à la propriété AutomationID, qui est généré par le compilateur à partir de l'attribut de nom de contrôle. Les commandes sans attribut de nom XAML ne recevront pas de Propriété automatisée. Cette idée est un exemple spécifique à bas niveau de L'importance de considérer les problèmes de conception des applications pour les choses comme la sécurité, l'extensibilité et l'automatisation des tests. P> blockQuote>
voir FrameworkElement. Propriété de tag p>
La propriété code> peut être utilisée. Il est de type
objet code> et peut être défini sur n'importe quoi. P>
Je pense que OR dans une propriété de style p> Reportez-vous à C # CODE: P> uielement.uid code> devrait fonctionner. Lui attribuer en XAML et l'accès dans le code.
code> p>
if (Keyboard.FocusedElement is UIElement uiElement)
{
Debug.WriteLine(this, $"{uiElement.Uid}");
}
Avez-vous essayé FrameworkElement.name Propriété ?
Oui Dmitry, mais le nom peut être vide, je ne veux pas mettre le nom de chaque contrôle exclusivement à des fins de journalisation
@Arsenmkrt, le Persistid La propriété semble Soyez ce que vous cherchez. Hélas, il est maintenant obsolète et n'a apparemment aucun remplacement. Peut-être que vous pouvez revenir à la génération d'identifiants uniques vous-même, dans ce cas, voir Cette question .
@ Frédéricamidi, une identité génératrice sûre est une bonne idée, mais dans la poste que vous avez considérée que l'identifiant sera modifié après la nouvelle demande de démarrage ... qui fera loger inutilisable, et je ne pense pas qu'il y ait un moyen de générer un identifiant stable.
Je crois comprendre que XAML construit une page qu'il ne nécessite pas un identifiant unique pour un élément UI. En l'absence d'attribution d'un identifiant unique, je ne pense pas que vous allez en trouver un. Gethashcode pourrait fonctionner.