3 votes

Un contrôle WPF nommé ne peut être trouvé lorsqu'il est ajouté de manière procédurale

Nous utilisons un contrôle d'édition tiers (TxTextControl) qui possède diverses barres d'outils et autres contrôles qui peuvent lui être attachés. Pour cela, il faut placer les barres d'outils quelque part dans la vue et les associer par leur nom. Cela ressemble à quelque chose comme ceci :

<tx:RulerBar x:Name="rulerBar"/>
<tx:TextControl RulerBar="rulerBar"/>

Cela fonctionne bien lorsqu'il est défini en XAML, mais nous avons un scénario dans lequel nous devons le construire de manière procédurale. Pour une raison quelconque, lorsque nous essayons d'associer la RulerBar (ou toute autre barre d'outils/contrôle), un message d'erreur s'affiche indiquant que la barre d'outils ne peut être localisée. Par exemple :

DockPanel dock = new DockPanel();
dock.Children.Add(new RulerBar { Name="rulerBar" });
dock.Children.Add(new TextControl { RulerBar = "rulerBar" });

J'ai également essayé d'ajouter des gestionnaires d'événements Loaded et de différer l'association de la RulerBar jusqu'à ce que les deux contrôles soient complètement chargés, mais j'obtiens toujours la même erreur. Cela devrait-il simplement fonctionner, ou y a-t-il une astuce qui m'échappe ? Malheureusement, l'association par nom est le seul mécanisme qu'ils fournissent, et nous ne pouvons pas associer les contrôles par référence.

3voto

Eyal Perry Points 1710

Dans WPF, le processus d'analyse syntaxique XAML associe la valeur de l'attribut x:Name d'un élément à son nom, ce qui permet d'effectuer une recherche par nom.

Alors pourquoi l'affectation de la propriété Name dans XAML fonctionne-t-elle ? En effet, la propriété Name est marquée d'un attribut qui indique à l'analyseur syntaxique de la traiter comme un attribut x:Name.

Comme vous ne mettez pas en œuvre la même logique que le parseur xaml, vous devrez faire un peu de codage supplémentaire pour que votre code fonctionne . Je ne savais pas moi-même comment faire, mais heureusement @Grx70 le savait voir sa réponse.

2voto

Grx70 Points 474

@Eyal Perry est correct dans son diagnostic du problème. Pour que cela fonctionne, vous devez utiliser la fonction FrameworkElement.RegisterName méthode. Voici un exemple d'utilisation :

DockPanel dock = new DockPanel();
var ruler = new RulerBar { Name = "rulerBar" };
dock.RegisterName(ruler.Name, ruler);
dock.Children.Add(ruler);
dock.Children.Add(new TextControl { RulerBar = "rulerBar" });

-3voto

F. Jihad Points 74

Je pense que vous devez d'abord ajouter la bibliothèque de la troisième partie à votre projet.
vous pouvez le faire en right click Projet dans le document tab
Ajouter>>Référence puis choisissez votre bibliothèque dans la fenêtre pop up qui ajoutera la référence. .dll afin que vous puissiez utiliser n'importe quelle classe de cette bibliothèque dans n'importe quelle classe de votre projet en ajoutant le fichier using pour la classe de bibliothèque que vous souhaitez utiliser.
Je vous ai répondu à partir des informations que vous avez fournies. Si vous nous montrez votre bibliothèque, je pourrais vous en dire plus.

salutations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X