Вертикальное меню на XAML (wpf)
Всем привет! Пытаюсь реализовать стандартное вертикальное меню на XAML со следующей логикой:
- Есть несколько главных элементов меню, содержащих несколько подменю.
- Каждое из этих меню/подменю содержит command
- В один момент времени может быть активно только один из элементов
- Активное меню должно быть раскрыто, активное подменю должно быть визуально обозначено.
- При наведении мыши - главный элемент меню раскрывается и отображает подменю.
- Главный элемент меню сворачивается, если был выбран какой-либо другой элемент не относящийся к этому меню.
- Пункт со звездочкой - при клике на активный элемент не должно происходить сворачивание/визуальное изменение. Т.е. если в подменю есть выделенный элемент - у нас не должно быть возможности свернуть это меню, либо снять визуальное отображение.
Как я пытаюсь сделать это:
- Беру листбокс
- Помещаю в него экспанды (главный элемент меню)
- В эти экспанды помещаю еще один листбокс
- Накидываю чекбоксы (подменю)
- На IsExpanded вешаю
IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}"
Это позволяет оставлять только одно развернутое меню
<ListBox x:Name="MyListBox"> <ListBoxItem> <Expander IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Header="First Expand"> <ListBox> <ListBoxItem> <CheckBox Content="First"/> </ListBoxItem> <ListBoxItem> <CheckBox Content="Second"/> </ListBoxItem> <ListBoxItem> <CheckBox Content="Third"/> </ListBoxItem> </ListBox> </Expander> </ListBoxItem> <ListBoxItem> <Expander IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Header="Second Expand"> <ListBox> <ListBoxItem> <CheckBox Content="First"/> </ListBoxItem> <ListBoxItem> <CheckBox Content="Second"/> </ListBoxItem> <ListBoxItem> <CheckBox Content="Third"/> </ListBoxItem> </ListBox> </Expander> </ListBoxItem> </ListBox>
Все остальные вещи я не совсем представляю как сделать, буду очень рад если поможете разобраться со следующим:
- Что должно содержаться внутри экспанда, для корректного поведения? Чекбокс можно включать/отключать, а одна радиокнопка должна быть нажата всегда. Ну и попытки через биндинги реализовать "в один момент времени активных элементов должно быть <= 1" не очень срабатывают.
- Как прицепить к экспанду "IsMouseOver" на разворачивание? Пытался в шаблон повесить тригер, но это почему-то не сработало.
- Есть ли адекватный способ объяснить экспанду что он должен уметь Command? Или проще использовать что-то вместо экспанда?
- Ну и весь 7-й пункт в постановке задачи. Это в принципе решается биндингами? Или тут проще залезть в код-бехайнд?
Буду очень благодарен за любую помощь!
p.s. Делал через ListBoxItem, потому что не понял как менять шаблон для ListBox.Items (отключить выделение/отступы и т.д.). Проект на гит не заливал, если кто-то подскажет как скинуть архивом - скину.