XamlWriter / Reader -> несколько вызовов конструктора, приводящих к дублированию элементов - PullRequest
3 голосов
/ 06 июля 2010

Я застрял здесь. я использую dragndrop-библиотеку, которая сериализует перетаскиваемые элементы UIE через XamlWriter.Save ().

Теперь я пытаюсь перетащить некоторые экземпляры класса, расширяющего Grid. в конструкторе я вставляю некоторые элементы в визуальное дерево. конструктор вызывается, когда объект десериализуется и элементы добавляются снова (и снова и снова в зависимости от того, как часто я перетаскиваю). к сожалению, Children.Count говорит мне, что нет дочерних элементов, если я получу значение из конструктора. если я получаю его извне (myGrid.Children.Count), это дает мне более высокую (нежелательную) сумму.

Есть ли какая-либо другая функция, которую я должен использовать для инициализации визуалов? или любой другой способ предотвратить эти дубликаты?

спасибо и ура

1 Ответ

1 голос
/ 07 июля 2010

заняло некоторое время, но я, кажется, нашел решение.
Теперь я могу создать базовый класс, уже содержащий визуальные элементы, необходимые всем подклассам. и они могут быть проанализированы через XamlWriter / Reader без дубликатов. гмм.

1) расширить UserControl (не Add-> UserControl, а Add-> Class и наследовать вручную)
2) поставить стандартный InitializeControl (); в конструктор
3) реализовать InitializeControl () и поместить в него макет, дочернее добавление и все, что угодно
4) xamlwrite / xamlread / Наследовать как сумасшедший

надеюсь, что это будет кому-то полезно, и что я не наблюдал за непредвиденным ..

- редактировать: конечно. будут дубликаты, но мы их не увидим. после того, как XamlReader завершен, существуют элементы UIE, созданные моим InitializeComponent (), и те, которые после этого анализируются на xaml. любые ссылки в коде относятся к созданным кодом элементам управления, которые НЕ отображаются: /

Вздох.

Один далеко не идеальный способ обойти это - поместить переключатель в инициализированный обработчик событий, например так: if(HasContent)<br> Initialize();<br> else<br> Reinitialize();<br> Multiinitialize();
где Initialize () добавит UIElements в визуальное дерево, Reinitialize () просто находит правильные ссылки (control = FindName("controlName")), а Multiinitialze () воссоздает обработчики событий и что еще теряется на пути через XamlReader.

Что ж, теперь вы можете создать экземпляр пользовательского унаследованного UserControl в xaml, но нет простого способа установить атрибуты. Это связано с тем, что установка атрибутов происходит до события Initialized и ожидают исключения NullPointerException. я думаю, вы могли бы обойти это с привязками.

но должен быть более легкий путь. пожалуйста, дайте мне знать!

...