Есть готовая версия кода, но там нет реализованного подменю, у меня не получается это реализовать, может найдётся кто сможет=)
Asked
Active
Viewed 175 times
2
-
Будьте более конкретны. Опишите что именно у вас не получилось и какую помощь вы рассчитываете получить. – tym32167 May 09 '20 at 02:26
-
То что на скриншоте, верхнее меню переключает UserControl обведённый красной рамкой (это получилось), но как переключаться внутри рамки по этому же методу, с помощью левого меню, обведённое синей рамкой справа. Я не прошу делать с точностью как на скриншоте, а просто доработать тот код, я просто не знаю как это сделать, но сам метод я изучил, но не хватает знаний чтобы расширить. То есть тоже самое только внутри самой UserControl. – ZerooneX May 09 '20 at 02:47
-
1вы должны понять, что никто не будет качать ваш проект и пытаться в нем разбираться и тем более дописывать его для вас. Я бы вам посоветовал вместо ссылок на яндекс диски добавить сюда, прямо в ваш вопрос, минимальный код, который иллюстрирует вашу проблему. Чтобы любой отвечающий мог взглянуть на ваш вопрос, сразу понять где проблема и вам что то посоветовать. – tym32167 May 09 '20 at 02:52
-
Я скинул ссылку вопроса, там код расписан, но без этого метода, просто улучшить ту версию ответа. – ZerooneX May 09 '20 at 02:59
-
Абсолютно так же, забудьте про меню верхнего уровня и сделайте чтобы работаю меню внутри краской рамки так как приведено в том топике. Потом все это вынесите в отдельную вьюху и переключайте ее в окне уже с помощью меню верхнего уровня – Андрей NOP May 09 '20 at 05:54
-
Андрей, я так делаю, но никак работать не хочет, возможно я что то упускаю. – ZerooneX May 10 '20 at 07:50
1 Answers
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>
aepot
- 49,560
-
Да, это конечно проще, я так уже делал, но не знаю как верхнее меню растянуть по центру, как я сделал это с кнопками на скриншоте) – ZerooneX May 10 '20 at 09:24
-
@ZeroneXYZ а зачем растягивать? У вас окно фиксированного размера? Пункты главного меню сверху фиксированы и не будут изменяться? Мне кажется, достаточно просто стилизации, чтобы у табов не было фона и рамок, и настроить необходимые паддинги для того, чтобы между ними было достаточное расстояние, чтобы всё это подходило под вашу дизайнерскую задумку. – aepot May 10 '20 at 09:30
-
-
Я посмотрел, я думаю как сделать вот такое меню https://dragablz.files.wordpress.com/2015/02/materialdesigndemo1.gif без дополнительный пакетов, не нужно отделять окно, нужен только такой стиль. – ZerooneX May 10 '20 at 10:17
-
-
@ZeroneXYZ старайтесь писать свои стили в целях самообучения, можно конечно на чужих примерах. А то потом попадете в ситуацию, когда вам нужно что-то где-то в чужих стилях поменять, а вы даже не знаете как оно работает. – aepot May 10 '20 at 10:29
-
У меня ошибка на эту строку <local:TabSizeConverter x:Key="tabSizeConverter"/> пишу на .NET Framework 3.5; Ошибка: тег "TabSizeConverter" не существует в пространстве имен XML "clr-namespace:WPF" https://ibb.co/WKSmgkP https://ibb.co/pLZdN7W скриншоты моего приложения. Там не TabControl, а обычные кнопки, я не представляю как такое сделать с TabControl=) – ZerooneX May 10 '20 at 11:14
-
@ZeroneXYZ дизайнер просто не видит добавленный класс, пока вы не выполните сборку. Только после сборки появляется возможность его использовать. Не знаю, почему Microsoft так сделали. – aepot May 10 '20 at 12:03
-
Всё исправил ошибку, дак вот, как TabControl сделать таким красивым, не где нету гайдов, есть на youtube, но там с использованием пакетов и .NET 4.5. Я кстати вспомнил почему я не хотел использовать TabControl=) скрины: https://ibb.co/hf2FcgK Так как я TabControl скрываю, соответственно я скрываю что внутри него. https://ibb.co/pJq227c – ZerooneX May 10 '20 at 12:25
-
@ZeroneXYZ
TabItem.Header- это кнопка,TabItem.Content- это содержимое табы. Можно и на то, и на другое навеситьTemplate, и хоть картинка, хоть что угодно туда влезет. – aepot May 10 '20 at 12:27 -
@ZeroneXYZ вам не нужен гайд по
TabControl, вам нужно научиться использоватьStyle,DataTemplateиControlTemplate. Оно одинаково работает со всеми контролами. – aepot May 10 '20 at 12:57 -
В том то и дело что я учусь на примерах, мне так лучше запоминается, потом переделываю под себя. Я могу скинуть свой проект, чтоб вы могли посмотреть и отредактировать. Потом я буду изучать то что изменили и исправлять, дополнять. – ZerooneX May 10 '20 at 13:01
-
@ZeroneXYZ ну вот у вас есть уже стиль для
TabItem, добавьте туда после</Style.Triggers>еще одинSetter, посмотрите, что вам предложит студия, когда вы напишетеProperty=. Используйте IntelliSense подсказки, без них очень тяжело жить в WPF, да и вообще где угодно. Начните с задания позрачногоBackground, размера и типа шрифтов, высоты заголовка табы, и так далее. Как научитесь менять стили, найдете, что есть свойствоTemplate, которое там же в стилях можно переопределить. Научитесь использовать общие ресурсы: это проx:KeyиStaticResource. – aepot May 10 '20 at 13:08 -
@ZeroneXYZ ищите гайды по xaml разметке в WPF. Изучив ее возможности вы сможете издеваться :) над любыми контролами, не только над
TabControl, но и над более сложными контролами типаTreeView. Туда еще добавить навык работы с конвертерами и мультиконвертерами (второй из двух в примере выше), и вообще кодить станет ощутимо веселее. – aepot May 10 '20 at 13:13


