MVVM Подменю WPF C#
Есть готовая версия кода, но там нет реализованного подменю, у меня не получается это реализовать, может найдётся кто сможет=)
Ответы (1 шт):
Вы уверены, что нашли самый простой способ решения своей задачи?
Вроде-как TabControl это всё умеет.
<Grid>
<TabControl>
<TabItem Header="Tab1">
<TabControl TabStripPlacement="Left">
<TabItem Header="SubTab1"/>
<TabItem Header="SubTab2"/>
<TabItem Header="SubTab3"/>
</TabControl>
</TabItem>
<TabItem Header="Tab2"/>
<TabItem Header="Tab3"/>
</TabControl>
</Grid>
Осталось только привязать табы к коллекциям, разметить шаблоны, добавить немного стилей для красоты, и готово.
Дополнение
Чтобы растянуть горизонтальные табы на всю ширину TabControl, можно воспользоваться следующим способом, который я подглядел здесь, и немного доработал.
1) Создайте конвертер, добавьте в решение следующий класс
public class TabSizeConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values[0] is int itemsCount && itemsCount > 0 && values[1] is double actualWidth)
{
double width = actualWidth / itemsCount;
return (width <= 1) ? 0 : (width - itemsCount); // минусую по пикселю за каждый таб, чтобы все влезло в одну строку
}
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => null;
}
2) Затем добавьте конвертер в ресурсы окна
<Window.Resources>
<local:TabSizeConverter x:Key="tabSizeConverter"/>
</Window.Resources>
3) Затем можно подключить этот конвертер к ширине табы, для того чтобы это аффектило только табконтрол с верхним расположением табов, я добавил Style.Trigger.
<TabControl>
<TabControl.Resources>
<Style TargetType="{x:Type TabItem}">
<Style.Triggers>
<Trigger Property="TabStripPlacement" Value="Top">
<Setter Property="Width">
<Setter.Value>
<MultiBinding Converter="{StaticResource tabSizeConverter}">
<Binding RelativeSource="{RelativeSource AncestorType={x:Type TabControl}}" Path="Items.Count"/>
<Binding RelativeSource="{RelativeSource AncestorType={x:Type TabControl}}" Path="ActualWidth" />
</MultiBinding>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</TabControl.Resources>
<TabItem Header="Tab1">
<TabControl TabStripPlacement="Left">
<TabItem Header="SubTab1"/>
<TabItem Header="SubTab2"/>
<TabItem Header="SubTab3"/>
</TabControl>
</TabItem>
<TabItem Header="Tab2"/>
<TabItem Header="Tab3"/>
</TabControl>


