Как я могу использовать ItemsHost родителя для HierarchicalDataTemplate в XAML?
У меня есть структура данных в виде дерева или меню, которую я хочу отобразить в 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). Но это все еще не отвечает на мой вопрос...
Вот как это выглядит графически:
http://i51.tinypic.com/2mpxwdi.jpg
Обратите внимание, как иерархические элементы должны быть расположены в одном и том же пространстве.
Есть ли чистое и простое решение для этого?
1 ответ
Я должен признать, что графический результат очень привлекателен, даже я бы не знал, как использовать такой контроль!
Чтобы ответить на ваш вопрос, я никогда не пытался использовать ту же панель, что и хост, но не думаю, что это будет возможно. Это нарушило бы схему иерархии визуального дерева. Любой визуальный элемент не может иметь больше, чем родитель.
Предполагая, что каждый уровень иерархии отображает свое собственное кольцо, я, несомненно, сделаю ставку на классический способ создания такого составного интерфейса. Нет сомнений в удобстве использования HierarchicalTemplates и ItemsControls, даже если это может быть сложной задачей.
Более того, я не понимаю, является ли ваша цель каким-то коллапсом, таким как обычный вид дерева. В этом случае отказ от классического подхода WPF был бы кошмаром!
Мое решение заключается в создании настраиваемой панели, позволяющей расположить своих детей на ринге.
Это не все. Должны быть созданы как пользовательский элемент управления, так и элемент управления. Первый будет представлять кольцевой срез, который должен быть визуализирован, а другой - как генератор. Элемент управления, действующий как держатель элемента, будет иметь два свойства: угол и радиус. Толщина может быть установлена отдельно.
Панель, вызывающая MeasureOverride, должна учитывать вложенность кольца и соответственно устанавливать угол и радиус своих дочерних элементов.
С моей точки зрения, контроль удержания должен происходить из ContentControl. Это потому, что вам нужно визуализировать форму среза, и эта задача должна быть выполнена с помощью этого элемента управления. Любой конкретный встроенный элемент управления (текст, кнопки и т. Д.) Может быть размещен внутри как контент.
Конечно, все это мозговой штурм. Я не гарантирую, что это лучшее решение, и оно не будет работать как есть.
Надеюсь, поможет.
ура