2010-07-05 14 views
3

Je suis un peu coincé ici. J'utilise une bibliothèque dragndrop qui sérialise les UIElements déplacés via XamlWriter.Save().XamlWriter/Reader -> appels de plusieurs constructeurs résultant en éléments dupliqués

maintenant j'essaye de dragndrop quelques instances d'une grille d'extension de classe. dans le constructeur, je pousse quelques éléments dans l'arbre visuel. le constructeur est appelé lorsque l'objet est désérialisé et les éléments sont ajoutés à nouveau (et encore et encore selon la fréquence de dragndrop). malheureusement, Children.Count me dit qu'il n'y a pas d'éléments enfants si je récupère la valeur dans le constructeur. Si je le récupère de l'extérieur (par myGrid.Children.Count), il me donne le montant le plus élevé (non désiré).

Y at-il une autre fonction que je devrais utiliser pour initialiser les visuels? ou tout autre moyen d'empêcher ces doublons?

remerciements et applaudissements

Répondre

1

a pris un certain temps, mais il me semble avoir trouvé une solution.
maintenant je suis capable de créer une classe de base contenant déjà les éléments visuels dont toutes les sous-classes ont besoin. et ils sont analysables via XamlWriter/Reader sans doublons. ouf.

1) étendre UserControl (dont Add-> UserControl mais Add-> Class et hériter manuellement)
2) mettre le standard InitializeControl(); dans le constructeur
3) mettre en œuvre InitializeControl() et mettre le layouting, l'enfant en ajoutant et tout là-dedans
4) xamlwrite/xamlread/inherit comme un fou

espérons qu'il sera utile à quelqu'un et que je havent supervisé la imprévisible ..

- modifier: of course. il y aura des doublons mais nous ne pouvons pas les voir. une fois le XamlReader terminé, il y a les UIElements créés par mon InitializeComponent() ET ceux qui reçoivent xaml-parsed après cela. toutes les références dans le code concernent les contrôles créés par le code qui ne sont PAS affichés:/

sigh.

un loin de façon parfaite autour est de mettre un interrupteur dans un gestionnaire d'événements Initialisé, comme ceci: if(HasContent)
Initialize();
else
Reinitialize();
Multiinitialize();

où le initialize() ajouterait les UIElements à l'arbre visuel, le réinitialise() juste trouve la références à droite (par control = FindName("controlName")) et le Multiinitialze() recrée les gestionnaires d'événements et quoi d'autre se perd sur le chemin à travers le XamlReader.

bien, maintenant vous pouvez instancier le UserControl hérité personnalisé dans xaml mais il n'y a pas de moyen facile de définir des attributs. En effet, la définition des attributs se produit avant l'événement Initialized et NullPointerExceptions sont en attente. vous pouvez contourner cela avec des reliures je suppose.

mais il doit être un moyen plus facile. s'il vous plaît, faites-moi savoir!