Как я могу использовать ItemsHost родителя для HierarchicalDataTemplate в XAML? - PullRequest
1 голос
/ 19 июля 2011

У меня есть структура данных в виде дерева или меню, которую я хочу отобразить в Panel (в частности, самодельном PolarPanel), но все элементы должны быть VisualChildren той же панели.

Если я определяю HierarchicalDataTemplate, мне нужно создать ItemsControls и указать его как IsItemsHost, или я здесь ошибаюсь?Могу ли я как-то ссылаться на ItemsHost родительского объекта?

    <HierarchicalDataTemplate
        DataType="{x:Type local:ItemsCollection}"
        ItemsSource="{Binding Children}"
        >
        <!--/* "virtual" ItemsHost referencing the parent's ItemsHost? */-->
    </HierarchicalDataTemplate>

(Мой первый обходной путь состоял в том, чтобы в корневом узле было свойство GetAllTheChildren, которое возвращает всех дочерних элементов и всех дочерних элементовSelectedChild, рекурсивно. Это нелегко работает вместе с ObservableCollection, потому что изменения должны пузыриться до корня, чтобы снова обновить GetAllTheChildren (который перезагружает больше элементов, чем было бы необходимо).

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

РЕДАКТИРОВАТЬ: я сейчасиспользуя улучшенный обходной путь, где все ItemControls / Panels нарисованы друг на друге.Это сохраняет иерархический аспект, что делает его гораздо лучшим решением, чем упомянутое выше (с GetAllTheChildren).Но это все еще не отвечает на мой вопрос ...

Вот как это выглядит графически:
Пример PolarMenu http://i51.tinypic.com/2mpxwdi.jpg
Обратите внимание, как иерархические элементы должны быть расположены в одном и том же пространстве.

Есть ли чистое и простое решение для этого?

1 Ответ

0 голосов
/ 26 июля 2011

Я должен признать, что графический результат очень привлекателен, даже я бы не знал, как использовать этот вид управления!

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

Предполагая, что каждый уровень иерархии отображает свое собственное кольцо, я, несомненно, сделаю ставку на классический способ создания такого составного пользовательского интерфейса. Нет сомнений в удобстве использования HierarchicalTemplates и ItemsControls, даже если это может быть сложной задачей.

Более того, я не понимаю, является ли ваша цель иметь какой-то коллапс, такой как обычный вид дерева. В этом случае отказ от классического подхода WPF был бы кошмаром!

Мое решение заключается в создании настраиваемой панели, позволяющей расположить своих детей на ринге.

Это еще не все. Должны быть созданы как пользовательский элемент управления, так и элемент управления. Первый будет представлять кольцевой срез, который должен быть визуализирован, а другой - как генератор. Элемент управления, действующий как держатель элемента, будет иметь два свойства: угол и радиус. Толщина может быть установлена ​​отдельно.

Панель, вызывающая MeasureOverride, должна учитывать вложенность кольца и соответственно устанавливать угол и радиус своих дочерних элементов.

С моей точки зрения, контроль удержания должен происходить из ContentControl. Это потому, что вам нужно визуализировать форму среза, и эта задача должна быть выполнена с помощью этого элемента управления. Любой конкретный встроенный элемент управления (текст, кнопки и т. Д.) Может быть помещен внутрь как контент.

Конечно, все это мозговой штурм. Я не гарантирую, что это лучшее решение, и оно не будет работать как есть.

Надеюсь, это поможет.

Приветствия

...