10
votes

Y a-t-il un identifiant unique pour WPF Uielement?

Pour la journalisation des actions utilisateur dans mes formulaires WPF, j'ai ajouté des gestionnaires d'événements globaux

Je veux me connecter exactement quel contrôle Fire l'événement, existe-t-il un identifiant unique pour un WPF uielement comme clientId dans asp.net?


5 commentaires

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.


7 Réponses :


0
votes

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


1 commentaires

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



10
votes

Pourquoi n'utilisez-vous pas le code de hachage?

Vous pouvez comparer les valeurs pour vous assurer qu'ils sont le même objet, et il est facile de les obtenir avec .gethashcode ()

Modifier

É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

Je veux dire que vous pourrait 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


2 commentaires

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



0
votes

Je crois, pour la journalisation des actions de l'utilisateur, vous pouvez utiliser le arborescence de l'uautomation 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.


1 commentaires

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



2
votes

Une façon, vous pouvez le faire est avec un attribut personnalisé. Comme ...

Le uielement code> Vous souhaitez enregistrer (userControl par exemple): p> xxx pré>

alors vous avez besoin de la classe d'attributs personnalisée xxx pré>

maintenant dans votre code, vous pouvez faire quelque chose comme ceci: p> xxx pré>

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>

this.GetCustomAttributes(...)


1 commentaires

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



2
votes

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.


0 commentaires

0
votes

voir FrameworkElement. Propriété de tag

La propriété peut être utilisée. Il est de type objet et peut être défini sur n'importe quoi.


0 commentaires

0
votes

Je pense que uielement.uid code> devrait fonctionner. Lui attribuer en XAML et l'accès dans le code.

code> p>

OR dans une propriété de style p>

code> p>

Reportez-vous à C # CODE: P>


    if (Keyboard.FocusedElement is UIElement uiElement)
    {
        Debug.WriteLine(this, $"{uiElement.Uid}");
    }


0 commentaires