Ходить по визуальному дереву - плохая практика?
В последнее время я видел некоторые комментарии о том, что ходьба по визуальному дереву - это плохая практика ( например, здесь), но я не видел и не нашел причины, почему это было бы плохой практикой.
В проекте, над которым я работаю, довольно много прогулок по дереву, поэтому мне интересно, стоит ли мне поменять все это на что-то другое или просто оставить все как есть.
Итак, я предполагаю, что мой главный вопрос здесь состоит в том, является ли визуальная прогулка по дереву действительно плохой практикой, и что более важно, если это так, почему?
Кроме того, где (если вообще?) Было бы нормально пройтись по визуальному дереву?
3 ответа
Прогулка по визуальному дереву часто сводится к проникновению в абстракцию, обеспечиваемую "естественными" механизмами WPF, ручному обеспечению того, что сама платформа должна делать (через объявления XAML, привязку данных и т. Д.). Это просто взломать. Иногда это указывает на то, что никто не знал, как правильно использовать WPF. (Кстати, это трудно использовать).
Вы не можете действительно знать, является ли визуальное дерево полным или нет; WPF, возможно, еще не сгенерировал все элементы управления (например, при заполнении списка множеством элементов). Для того, чтобы решить эту проблему, вам необходимо реализовать меры предосторожности, обработать
LayoutUpdated
события и т. д., что делает ваш код слишком сложным.
Я бы сказал, во-первых, что вы получите различные мнения по этому вопросу.
В примере, на который вы ссылаетесь, я бы сказал, что обходчик дерева визуалов в этом случае был неправильным решением - WPF обычно лучше всего использовать с каким-либо MVVM или MVP-подобным шаблоном, а это означает привязку данных, и если вы связываетесь с соответствующие структуры вы можете устранить многое из того, что вы могли бы сделать с помощью визуальной прогулки по дереву.
Я склонен использовать его только для "спецэффектов". Большое внутреннее приложение WPF, над которым я работаю, имеет некоторый визуальный код обхода дерева, который добавляет удобное поведение некоторым ItemControl
с возможностью повторного использования (очень весело с параметрами типа, чтобы это работало).
Мы также рассмотрим визуальное дерево в реализации некоторых прикрепленных свойств, которые являются частью системы, которая контролирует, разрешено ли конкретному пользователю манипулировать определенными частями пользовательского интерфейса. Это связано с тем, что эта система должна трансформировать визуальное дерево независимо от того, что говорят базовые данные - пользовательские разрешения являются сквозной проблемой, о которой базовым данным не нужно беспокоиться на каждом этапе.
По сути, мы делаем это только для того, чтобы сделать что-то с самим пользовательским интерфейсом - поведение пользовательского интерфейса, которое не может быть выполнено более удобным способом (и, честно говоря, большинство других способов более удобны в большинстве случаев), или на самом деле настройку визуального дерева на основе на некоторый фактор, который не очень удобно выразить в данных, с которыми связан пользовательский интерфейс. Если речь идет о манипулировании данными, мы всегда делаем это в структурах данных бэкэнда или ViewModels.
Это зависит от того, почему вы ходите по визуальному дереву. Существует множество механизмов, которые автоматизируют ваше представление, и в большинстве случаев их более чем достаточно для выполнения даже очень сложных элементов управления.
За годы работы с wpf я использовал обход дерева только при создании некоторых нестандартных поведений, которые нельзя было бы сделать иначе (или я не нашел другого способа сделать это). Я считаю, что ходячее визуальное дерево - инструмент, как и любое другое, например, отражение. Это хорошо знать, и у него есть свои приложения и недостатки.