Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
WPF

Проблемы с анимацией RadioButton на главной форме с соблюдением MVVM

21.05.2024, 16:46. Показов 3924. Ответов 43

Студворк — интернет-сервис помощи студентам
На моей главной форме есть колонка с RadioButton и я хотел сделать так что бы по нажатию по разделу срабатывала анимация при которой справа на лево появлялся другой список RadioButton которые являются подразделом RadioButton который был нажат. Покажу на примере, как я пытался это реализовать
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
<Storyboard x:Key="EnterSubmenu">
    <DoubleAnimation
        Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
        From="15" To="0" Duration="0:0:0.3"/>
    <DoubleAnimation
        Storyboard.TargetProperty="Opacity"
        From="0" To="1.0" Duration="0:0:0.3"/>
    <ObjectAnimationUsingKeyFrames
        Storyboard.TargetProperty="Visibility"
        Duration="0:0:0.1">
        <DiscreteObjectKeyFrame KeyTime="0:0:0.1" Value="{x:Static Visibility.Visible}"/>
    </ObjectAnimationUsingKeyFrames>
</Storyboard>
 
<Storyboard x:Key="LeaveSubmenu">
    <DoubleAnimation
        Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
        From="0" To="15" Duration="0:0:0.2"/>
    <DoubleAnimation
        Storyboard.TargetProperty="Opacity"
        From="1.0" To="0" Duration="0:0:0.2"/>
    <ObjectAnimationUsingKeyFrames
        Storyboard.TargetProperty="Visibility"
        Duration="0:0:0.2">
        <DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{x:Static Visibility.Collapsed}"/>
    </ObjectAnimationUsingKeyFrames>
    <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(ToggleButton.IsChecked)">
        <DiscreteBooleanKeyFrame KeyTime="0" Value="False" />
    </BooleanAnimationUsingKeyFrames>
</Storyboard>
 
<Style x:Key="DownBtnStyleProduct" TargetType="RadioButton" BasedOn="{StaticResource DownBtnStyle}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=butProduct, Path=IsChecked}" Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard Storyboard="{StaticResource EnterSubmenu}"/>
            </DataTrigger.EnterActions>
            <DataTrigger.ExitActions>
                <BeginStoryboard Storyboard="{StaticResource LeaveSubmenu}"/>
            </DataTrigger.ExitActions>
        </DataTrigger>
    </Style.Triggers>
</Style>
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
        <res:Btn 
x:Name="butProduct"
IsChecked="{Binding Path=CurrentView, Converter={StaticResource InstanceEqualsConverter}, ConverterParameter={x:Type view:Product}}"
Tag="0"
Style="{StaticResource BtnStyle}"
Grid.Row="1" Grid.Column="1"
Foreground="#D9D9D9"
FontSize="16"
FontFamily="Nautilus Pompilius" 
VerticalAlignment="Stretch" 
HorizontalAlignment="Stretch" 
Margin="0,5,0,5">
 
 
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="37*"/>
                    <ColumnDefinition Width="128*"/>
                </Grid.ColumnDefinitions>
 
                <Image 
        Source="/Resources/Pictures/ImageProductMenu.png"
        HorizontalAlignment="Center" 
        Width="40" 
        Height="40" 
        VerticalAlignment="Center"/>
 
                <TextBlock
        Text="Инвентарь" 
        VerticalAlignment="Center" 
        FontSize="20" 
        HorizontalAlignment="Center"
        Grid.Column="0"
        Grid.ColumnSpan="2"/>
 
            </Grid>
 
 
 
        </res:Btn>
 
        <StackPanel
Orientation="Vertical">
 
            <res:Btn 
    Grid.Row="1"
    Grid.Column="1"
    IsChecked="{Binding Path=CurrentView, Converter={StaticResource InstanceEqualsConverter}, ConverterParameter={x:Type view:Category}}"
    Style="{StaticResource DownBtnStyleProduct}"
    Foreground="#D9D9D9"
    FontSize="16"
    FontFamily="Nautilus Pompilius" 
    VerticalAlignment="Stretch" 
    HorizontalAlignment="Stretch" 
    Margin="30,5,0,5">
 
                <res:Btn.RenderTransform>
                    <TranslateTransform X="0" />
                </res:Btn.RenderTransform>
 
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="37*"/>
                        <ColumnDefinition Width="128*"/>
                    </Grid.ColumnDefinitions>
 
                    <Image 
            Source="/Resources/Pictures/ImageCategoryMenu.png"
            HorizontalAlignment="Center" 
            Width="30" 
            Height="30" 
            VerticalAlignment="Center"/>
 
                    <TextBlock
            Text="Справочник категорий" 
            VerticalAlignment="Center" 
            FontSize="18" 
            HorizontalAlignment="Center"
            Grid.Column="0"
            Grid.ColumnSpan="2"/>
 
                </Grid>
 
            </res:Btn>
</StackPanel>
Тут представлены 2 анимации прихода и ухода, стиль для RadioButton который является подразделом, так вот. При нажатии все срабатывает верно подразделы появляются но если нажать на подраздел IsChecked переходит в false у главного и срабатывает анимация ухода, я хотел бы сделать так что бы если IsChecked true находился у RadioButton который является подразделом анимация ухода не срабатывала. Я бы написал код в behind но я реализую MVVM а это нарушит паттерн. Буду очень благодарен кто сможет помочь
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2024, 16:46
Ответы с готовыми решениями:

Как при нажатии radiobutton на форме 1 radiobutton на форме 2 активировался?
Как при нажатии radiobutton на форме 1 radiobutton на форме 2 активировался?

Скрыть таблицу в MVVM по нажатию на RadioButton
Как скрыть таблицу по нажатия на RadioButton? Вот название таблицы: &lt;DataGrid ItemsSource=&quot;{Binding ExtensionCollection}&quot; ...

Как проверить, что RadioButton включен. MVVM
Есть радио баттон на форме как узнать чекнут ли он, реализовать шаблоном MVVM? Помогите плз

43
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
23.05.2024, 20:16  [ТС]
Студворк — интернет-сервис помощи студентам
То что вы сделали выглядит хорошо но это не работает как я хотел бы. Я поместил видео в архив как это должно работать и выглядеть
Вложения
Тип файла: rar Example.rar (6.93 Мб, 9 просмотров)
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
23.05.2024, 20:19
Danilg467, я показал пример с IsChecked свойством, я сделал по значению true. Вы можете сделать такой же контрол, но с обратной логикой. Для false.
1
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
23.05.2024, 20:24  [ТС]
Спасибо большое за проделанную работу
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
23.05.2024, 20:29
Цитата Сообщение от Danilg467 Посмотреть сообщение
Я поместил видео в архив как это должно работать и выглядеть
У вас при клике отображается доп панелька. Аналог я сделал в примере.
В целом пример с любой панелью, взять тот же ComboBox у него в роли кнопки выступает ToogleButton, в состояние Checked он отображает контент. У вас на видео так же, при клике раскрывается контент для RadioButton.
В примере если обратите внимание то для IsCheked ничего не биндится.

Также не пойму в чем смысл, если мы можем отображать в состояние Checked подгруппу, то зачем нужна обратная логика для состояние UnChecked? Это как минимум лишний код ради обратной логики. Вместо это если вам нужна под группа всегда переведите IsCheked в true. На команды это никак не повлияет

Добавлено через 2 минуты
Цитата Сообщение от Danilg467 Посмотреть сообщение
Спасибо большое за проделанную работу
Рад что смог помочь разобраться с чем то. Если вопросы будут пишите, но все равно не пойму зачем нужна обратная логика как IsChecked не имеет никаких привязок.
1
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
24.05.2024, 18:52  [ТС]
Цитата Сообщение от xellan24rus Посмотреть сообщение
Если вопросы будут пишите
Чувак спасибо тебе за помощь, я реализовал по примеру как ты сделал но все же я не смог кое что сделать а именно.
Сначала приведу код который сделал

Стиль
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:local="clr-namespace:DbMaintenanceWPF.Resources.Styles"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="FocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="2" StrokeDashArray="1 2" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" SnapsToDevicePixels="true" StrokeThickness="1"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
 
 
    <Style x:Key="{x:Type local:CustomRadioBut}"
        TargetType="RadioButton">
        <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
        <Setter Property="MinHeight" Value="40"></Setter>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
        <Setter Property="VerticalContentAlignment" Value="Stretch"></Setter>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Padding" Value="14 0 0 0"></Setter>
 
 
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="RadioButton">
 
                    <Border 
                        BorderThickness="0"
                        CornerRadius="15"
                        Height="{TemplateBinding Height}"
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch"
                        SnapsToDevicePixels="True">
 
                        
 
                        <Grid
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Stretch"
                            Height="{TemplateBinding Height}">
 
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
 
                            <Border x:Name="border"
                                    BorderThickness="0"
                                    CornerRadius="15"
                                    Height="{TemplateBinding Height}"
                                    HorizontalAlignment="Stretch"
                                    VerticalAlignment="Stretch"
                                    SnapsToDevicePixels="True">
 
                                <Border.Background>
                                    <SolidColorBrush x:Name="BorderBackground"
                                            Color="#093A5C" />
                                </Border.Background>
 
                            </Border>
 
 
                            <Border x:Name="Indicator"
                     Height="20"
                     Width="5"
                     Margin="5,0,0,0"           
                     HorizontalAlignment="Left"
                     VerticalAlignment="Center"
                     Background="#FFFFFF"
                     Visibility="Collapsed"
                     CornerRadius="2"/>
 
                            <ContentPresenter 
                                x:Name="contentPresenter"
                                MinHeight="{TemplateBinding MinHeight}"
                                Grid.Row="0" 
                                Focusable="False" 
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                Margin="{TemplateBinding Padding}"
                                RecognizesAccessKey="True" 
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            
                            <ContentControl 
                                Name="subContent" 
                                Visibility="Collapsed"
                                Content="{Binding SubPanel, RelativeSource={RelativeSource AncestorType=local:CustomRadioBut}}" 
                                Grid.Row="1"
                                Margin="40,0,0,0"
                                Focusable="False" 
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                
                                <ContentControl.RenderTransform>
                                    <TranslateTransform X="0" />
                                </ContentControl.RenderTransform>
                            </ContentControl>
                        </Grid>
 
 
                    </Border>
 
 
                    <ControlTemplate.Triggers>
 
 
                        <Trigger Property="IsMouseOver"
                  Value="True">
                            <Setter Property="Visibility"
                     TargetName="Indicator"
                     Value="Visible" />
                        </Trigger>
 
                        <EventTrigger RoutedEvent="Border.MouseEnter"
                       SourceName="border">
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="BorderBackground"
                                     Storyboard.TargetProperty="Color"
                                     From="#093A5C"
                                     To="#0E5B8E"
                                     Duration="0:0:0.3" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
 
                        <EventTrigger RoutedEvent="Border.MouseLeave"
                       SourceName="border">
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="BorderBackground"
                                     Storyboard.TargetProperty="Color"
                                     From="#0E5B8E"
                                     To="#093A5C"
                                     Duration="0:0:0.3" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
 
 
                        <Trigger Property="IsChecked" Value="True">
                            <Trigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard TargetName="subContent">
                                        <DoubleAnimation
                Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                From="15" To="0" Duration="0:0:0.3"/>
                                        <DoubleAnimation
                Storyboard.TargetProperty="Opacity"
                From="0" To="1.0" Duration="0:0:0.3"/>
                                        <ObjectAnimationUsingKeyFrames
                Storyboard.TargetProperty="Visibility"
                Duration="0:0:0.1">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0.1" Value="{x:Static Visibility.Visible}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.EnterActions>
 
                            <Trigger.ExitActions>
                                <BeginStoryboard>
                                    <Storyboard TargetName="subContent">
                                        <DoubleAnimation
                Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                From="0" To="15" Duration="0:0:0.2"/>
                                        <DoubleAnimation
                Storyboard.TargetProperty="Opacity"
                From="1.0" To="0" Duration="0:0:0.2"/>
                                        <ObjectAnimationUsingKeyFrames
                Storyboard.TargetProperty="Visibility"
                Duration="0:0:0.2">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{x:Static Visibility.Collapsed}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.ExitActions>
                        </Trigger>
 
 
                        <Trigger Property="IsChecked"
                  Value="True">
                            <Setter Property="Background"
                     TargetName="border"
                     Value="#1069A0" />
                            <Setter Property="Visibility"
                     TargetName="Indicator"
                     Value="Visible" />
                        </Trigger>
 
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
То что ты писал в классе я ничего не менял

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
                    <st:CustomRadioBut.SubPanel>
 
                        <StackPanel Orientation="Vertical">
                            <st:CustomRadioBut Margin="0 5 0 0" 
Command="{x:Static vm:ViewModelLocator.NavigatorCurrentViewCommand}" 
CommandParameter="CategoryModel"
HorizontalAlignment="Stretch"
VerticalAlignment="Center">
 
                                <st:CustomRadioBut.Content>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="37*"/>
                                            <ColumnDefinition Width="128*"/>
                                        </Grid.ColumnDefinitions>
 
                                        <Image 
             Source="/Resources/Pictures/ImageCategoryMenu.png"
             HorizontalAlignment="Center" 
             Width="30" 
             Height="30" 
             VerticalAlignment="Center"/>
 
                                        <TextBlock
             Text="Справочник категорий" 
             Foreground="#D9D9D9"
             FontFamily="Nautilus Pompilius"         
             VerticalAlignment="Center" 
             FontSize="18" 
             HorizontalAlignment="Center"
             Grid.Column="0"
             Grid.ColumnSpan="2"/>
 
                                    </Grid>
                                </st:CustomRadioBut.Content>
 
                            </st:CustomRadioBut>
 
                            <st:CustomRadioBut  Margin="0 5 0 0" 
                                                Command="{x:Static vm:ViewModelLocator.NavigatorCurrentViewCommand}" 
                                                CommandParameter="BrandModel"
                                                HorizontalAlignment="Stretch"
                                                VerticalAlignment="Center">
 
                                <st:CustomRadioBut.Content>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="37*"/>
                                            <ColumnDefinition Width="128*"/>
                                        </Grid.ColumnDefinitions>
 
                                        <Image 
                                Source="/Resources/Pictures/ImageBrandMenu.png"
                                HorizontalAlignment="Center" 
                                Width="30" 
                                Height="30" 
                                VerticalAlignment="Center"/>
 
                                        <TextBlock
                                Text="Справочник брендов" 
                                Foreground="#D9D9D9"
                                FontFamily="Nautilus Pompilius" 
                                VerticalAlignment="Center" 
                                FontSize="18" 
                                HorizontalAlignment="Center"
                                Grid.Column="0"
                                Grid.ColumnSpan="2"/>
 
                                    </Grid>
                                </st:CustomRadioBut.Content>
 
                            </st:CustomRadioBut>
 
                            <st:CustomRadioBut  Margin="0 5 0 0" 
                    Command="{x:Static vm:ViewModelLocator.NavigatorCurrentViewCommand}" 
                    CommandParameter="UnitModel"
                    HorizontalAlignment="Stretch"
                    VerticalAlignment="Center">
 
                                <st:CustomRadioBut.Content>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="37*"/>
                                            <ColumnDefinition Width="128*"/>
                                        </Grid.ColumnDefinitions>
 
                                        <Image 
                                Source="/Resources/Pictures/ImageUnitMenu.png"
                                HorizontalAlignment="Center" 
                                Width="30" 
                                Height="30" 
                                VerticalAlignment="Center"/>
 
                                        <TextBlock
                                Text="Справочник единиц" 
                                Foreground="#D9D9D9"
                                FontFamily="Nautilus Pompilius" 
                                VerticalAlignment="Center" 
                                FontSize="18" 
                                HorizontalAlignment="Center"
                                Grid.Column="0"
                                Grid.ColumnSpan="2"/>
 
                                    </Grid>
                                </st:CustomRadioBut.Content>
 
                            </st:CustomRadioBut>
 
                        </StackPanel>
 
                    </st:CustomRadioBut.SubPanel>
вот тут я это использую на главной форме.
Помнишь я приводил ситуации работы так вот тут тоже самое
мне нужно что бы после переключения по подразделам я нажимал на главную и значения подразделов IsChecked становились False
а также что бы когда я переключался на другой основной RadioButton значение IsChecked подразделов становились так же False
Поможешь с реализацией, пожалуйста
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
24.05.2024, 19:56
Цитата Сообщение от Danilg467 Посмотреть сообщение
XML
1
2
<Style x:Key="{x:Type local:CustomRadioBut}"
        TargetType="RadioButton">
Вы тут напутали
должно быть
XML
1
<Style TargetType="{x:Type local:CustomRadioBut}">
Key задавать не нужно ведь это Custom Control, для него стиль применяется по умолчанию. Так же важно указать файл xaml по пути Themes\Generic.xaml в примере это сделано, это важно чтобы стиль применялся. Тем самым чтобы использовать custom control в App.xaml писать ничего не нужно.
Цитата Сообщение от Danilg467 Посмотреть сообщение
<ControlTemplate TargetType="RadioButton">
Так тут должно быть TargetType="{x:Type local:CustomRadioBut}" ведь вы работаете с Custom Control, а не с RadioButton. Понятно что и так работать будет, но это не правильно, увы.

Над остальным, реализуемо. Скорее всего завтра сделаю.
0
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
24.05.2024, 23:02  [ТС]
xellan24rus, Я внес правки но он теперь вовсе не отображается и я не понимаю почему

XML
1
2
3
4
5
6
7
8
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/DBMaintenanceWPF;component/Resources/Styles/CustomRadioBut.xaml"/>
    </ResourceDictionary.MergedDictionaries>
 
</ResourceDictionary>
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:local="clr-namespace:DbMaintenanceWPF.Resources.Styles"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
    <Style x:Key="FocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="2" StrokeDashArray="1 2" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" SnapsToDevicePixels="true" StrokeThickness="1"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
 
 
    <Style TargetType="RadioButton">
        <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
        <Setter Property="MinHeight" Value="40"></Setter>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
        <Setter Property="VerticalContentAlignment" Value="Stretch"></Setter>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Padding" Value="14 0 0 0"></Setter>
 
 
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomRadioBut}">
 
                    <Border 
                        BorderThickness="0"
                        CornerRadius="15"
                        Height="{TemplateBinding Height}"
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch"
                        SnapsToDevicePixels="True">
 
                        
 
                        <Grid
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Stretch"
                            Height="{TemplateBinding Height}">
 
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
 
                            <Border x:Name="border"
                                    BorderThickness="0"
                                    CornerRadius="15"
                                    Height="{TemplateBinding Height}"
                                    HorizontalAlignment="Stretch"
                                    VerticalAlignment="Stretch"
                                    SnapsToDevicePixels="True">
 
                                <Border.Background>
                                    <SolidColorBrush x:Name="BorderBackground"
                                            Color="#093A5C" />
                                </Border.Background>
 
                            </Border>
 
 
                            <Border x:Name="Indicator"
                     Height="20"
                     Width="5"
                     Margin="5,0,0,0"           
                     HorizontalAlignment="Left"
                     VerticalAlignment="Center"
                     Background="#FFFFFF"
                     Visibility="Collapsed"
                     CornerRadius="2"/>
 
                            <ContentPresenter 
                                x:Name="contentPresenter"
                                MinHeight="{TemplateBinding MinHeight}"
                                Grid.Row="0" 
                                Focusable="False" 
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                Margin="{TemplateBinding Padding}"
                                RecognizesAccessKey="True" 
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            
                            <ContentControl 
                                Name="subContent" 
                                Visibility="Collapsed"
                                Content="{Binding SubPanel, RelativeSource={RelativeSource AncestorType=local:CustomRadioBut}}" 
                                Grid.Row="1"
                                Margin="40,0,0,0"
                                Focusable="False" 
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                
                                <ContentControl.RenderTransform>
                                    <TranslateTransform X="0" />
                                </ContentControl.RenderTransform>
                            </ContentControl>
                        </Grid>
 
 
                    </Border>
 
 
                    <ControlTemplate.Triggers>
 
 
                        <Trigger Property="IsMouseOver"
                  Value="True">
                            <Setter Property="Visibility"
                     TargetName="Indicator"
                     Value="Visible" />
                        </Trigger>
 
                        <EventTrigger RoutedEvent="Border.MouseEnter"
                       SourceName="border">
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="BorderBackground"
                                     Storyboard.TargetProperty="Color"
                                     From="#093A5C"
                                     To="#0E5B8E"
                                     Duration="0:0:0.3" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
 
                        <EventTrigger RoutedEvent="Border.MouseLeave"
                       SourceName="border">
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="BorderBackground"
                                     Storyboard.TargetProperty="Color"
                                     From="#0E5B8E"
                                     To="#093A5C"
                                     Duration="0:0:0.3" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
 
 
                        <Trigger Property="IsChecked" Value="True">
                            <Trigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard TargetName="subContent">
                                        <DoubleAnimation
                Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                From="15" To="0" Duration="0:0:0.3"/>
                                        <DoubleAnimation
                Storyboard.TargetProperty="Opacity"
                From="0" To="1.0" Duration="0:0:0.3"/>
                                        <ObjectAnimationUsingKeyFrames
                Storyboard.TargetProperty="Visibility"
                Duration="0:0:0.1">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0.1" Value="{x:Static Visibility.Visible}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.EnterActions>
 
                            <Trigger.ExitActions>
                                <BeginStoryboard>
                                    <Storyboard TargetName="subContent">
                                        <DoubleAnimation
                Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                From="0" To="15" Duration="0:0:0.2"/>
                                        <DoubleAnimation
                Storyboard.TargetProperty="Opacity"
                From="1.0" To="0" Duration="0:0:0.2"/>
                                        <ObjectAnimationUsingKeyFrames
                Storyboard.TargetProperty="Visibility"
                Duration="0:0:0.2">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{x:Static Visibility.Collapsed}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.ExitActions>
                        </Trigger>
 
 
                        <Trigger Property="IsChecked"
                  Value="True">
                            <Setter Property="Background"
                     TargetName="border"
                     Value="#1069A0" />
                            <Setter Property="Visibility"
                     TargetName="Indicator"
                     Value="Visible" />
                        </Trigger>
 
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
XML
1
2
3
4
5
6
7
8
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/DBMaintenanceWPF;component/Resources/Styles/CustomRadioBut.xaml"/>
    </ResourceDictionary.MergedDictionaries>
 
</ResourceDictionary>
Добавлено через 34 минуты
xellan24rus, еще интересно узнать как вы сделали RadioButtonCC.xaml и RadioButtonCC.xaml.cs ну типо как так что они вложены в друг друга, вы переделали UserControl просто я когда создаю CustomControl это представляет собой обычный класс со статическим конструктором
0
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
25.05.2024, 10:07  [ТС]
А извините уже разобрался все заработало. я насчет этого
Цитата Сообщение от Danilg467 Посмотреть сообщение
Я внес правки но он теперь вовсе не отображается
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
25.05.2024, 11:52
Цитата Сообщение от Danilg467 Посмотреть сообщение
еще интересно узнать как вы сделали RadioButtonCC.xaml и RadioButtonCC.xaml.cs
В wpf если давать такие именно, то класс автоматически становится вложенным =)
Цитата Сообщение от Danilg467 Посмотреть сообщение
вы переделали UserControl
Нет я не переделывал UserControl, я создал ручками с нуля. Вручную создал словарь, и просто создал класс. А далее написал нужный код. И Themes\Generic.xaml тоже сам создал.

А если создавать при помощи студии Custom Control то она сама создает Themes\Generic и xaml файл и cs файл. Но потом все переносить по папкам, пространства имен править. Нудно, поэтому создаю ручками, меньше заморочек.

Добавлено через 1 минуту
Цитата Сообщение от Danilg467 Посмотреть сообщение
уже разобрался все заработало
Хорошо тогда что разобрались)
Цитата Сообщение от Danilg467 Посмотреть сообщение
<Style TargetType="RadioButton">
Вот здесь тип вашего Custom Control надо указывать, а не RadioButton
1
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
25.05.2024, 12:41  [ТС]
Да просто я невнимательный пересмотрел ваш пример и все получилось
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
25.05.2024, 12:53
Danilg467, это нормально, у меня тоже такое бывает. Порой кучу времени потратишь потому что указал где то что то не то.
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
25.05.2024, 19:48
Цитата Сообщение от Danilg467 Посмотреть сообщение
что бы когда я переключался на другой основной RadioButton значение IsChecked подразделов становились так же False
Тут мы можем сделать ap свойство зависимое от главного Ischecked
Можем сделать так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System.Windows;
using System.Windows.Media;
 
 
namespace Danilg467RadioButtonCC.CustomControls
{
    public class RadioButtonHellper
    {
        public static readonly DependencyProperty ResetChildIsCheckedProperty = DependencyProperty.RegisterAttached(
            "ResetChildIsChecked",
            typeof(bool),
            typeof(RadioButtonHellper),
            new PropertyMetadata(false, OnResetChildIsCheckedChanged));
 
        public static void SetResetChildIsChecked(DependencyObject element, bool value) => element.SetValue(ResetChildIsCheckedProperty, value);
 
        public static bool GetResetChildIsChecked(DependencyObject element) => (bool)element.GetValue(ResetChildIsCheckedProperty);
 
        private static void OnResetChildIsCheckedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is RadioButtonCC radioButton && !(bool)e.NewValue)
            {
                var temp = FindVisualChildren<RadioButtonCC>(radioButton);
                foreach (var child in temp)
                {
                    child.IsChecked = false; // Выключаем видимость SubPanel
                }
            }
        }
        /// <summary>
        /// Поиск дочерних элементов
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="depObj"></param>
        /// <returns></returns>
        public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
        {
            if (depObj != null)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                    if (child != null && child is T)
                    {
                        yield return (T)child;
                    }
 
                    foreach (T childOfChild in FindVisualChildren<T>(child))
                    {
                        yield return childOfChild;
                    }
                }
            }
        }
    }
}
Использование, у главной кнопки нужно иницализовать ар свойство и сделать привязку к IsChecked
XML
1
control:RadioButtonHellper.ResetChildIsChecked="{Binding IsChecked, RelativeSource={RelativeSource Self}}"
XML
1
2
3
4
5
6
7
8
9
10
<control:RadioButtonCC
                       Margin="0 15 0 0" 
                       control:RadioButtonHellper.ResetChildIsChecked="{Binding IsChecked, RelativeSource={RelativeSource Self}}"
                       Command="{x:Static local:Navigator.NavigatorCurrentViewCommand}" 
                       CommandParameter="CategoriesVM" Checked="test_Checked">
     <control:RadioButtonCC.Content>
         <TextBlock VerticalAlignment="Center">Categories</TextBlock>
     </control:RadioButtonCC.Content>
 
     <control:RadioButtonCC.SubPanel>
Цитата Сообщение от Danilg467 Посмотреть сообщение
мне нужно что бы после переключения по подразделам я нажимал на главную и значения подразделов IsChecked становились False
С этим у меня не вышло, такое ощущение что Checked событие и Click одно и тоже... Так как при первом клике вызывается событие Checked. А так как видимость задается раньше чем идет отклик в событие, то в событие Click получаем все свойства которые подходят для условия деактивации видимости.

Добавлено через 28 минут
Я разобрался с ситуациями нужными. Чуть позже напишу ответ.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
25.05.2024, 23:58
Цитата Сообщение от Danilg467 Посмотреть сообщение
Example.rar (6.93 Мб, 9 просмотров)
Просьба: загружайте видео на YouTube, а здесь дайте ссылку на него в тегах [YOUTUBE]Id ролика[/YOUTUBE].
Тогда ролик можно будет посмотреть без загрузки на комп.

Цитата Сообщение от Danilg467 Посмотреть сообщение
Я поместил видео в архив как это должно работать и выглядеть
Посмотрел видео.
И честно говоря не понял зачем здесь RadioButton.
На мой взгляд типичное иерархическое меню. Проще всего будет реализовать с помощью ListBox и Expander.
0
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
26.05.2024, 00:11  [ТС]
Элд Хасп, Учту в следующий раз извините.
Возможно проще, но я хотел бы именно такую реализацию

Добавлено через 56 секунд
xellan24rus, Спасибо большое за старания
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
26.05.2024, 00:13
Цитата Сообщение от Danilg467 Посмотреть сообщение
Возможно проще, но я хотел бы именно такую реализацию
Вы о результате, или о самой реализации с использованием именно RadioButton?
0
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
26.05.2024, 00:22  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
именно RadioButton
RadioButton

Добавлено через 3 минуты
xellan24rus, Да ваше решение помогло, жду продолжения. Еще раз спасибо вам за ваш труд!
1
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
26.05.2024, 02:56
Лучший ответ Сообщение было отмечено Danilg467 как решение

Решение

Цитата Сообщение от Элд Хасп Посмотреть сообщение
или о самой реализации с использованием именно RadioButton?
Автор о самой реализации и суть использования, есть RadioButton у него есть выпадающая панель. А в ней может быть хоть что, включая другие RadioButton с панелями и вот для родителя панели есть ситуации которые нужно обработать.
Так как в выдающей панели может быть что, я использовал ap чтобы получить контроль над дочерними панелями всех элементов. В целом вижу это как единичная реализация. Её аналог это TreeView где может быть дерево из элементов.
Но вопрос был о RadioButton, да и TreeView я плохо знаком, в реальном проекте не пользовался ни разу. Поэтому как то так =)

Danilg467, добрался до ноута =)
Для ваших ситуаций нужно управлять видимостью выпадающей панелью. Для этого нужно создать какое то свойство. В нашем случае я назвал его SubPanelVisibility.
Полный код cs для CustomControl

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System.Windows;
using System.Windows.Controls;
 
namespace Danilg467RadioButtonCC.CustomControls
{
    public class RadioButtonCC : RadioButton
    {
        static RadioButtonCC() => DefaultStyleKeyProperty.OverrideMetadata(typeof(RadioButtonCC), new FrameworkPropertyMetadata(typeof(RadioButtonCC)));
 
        public static readonly DependencyProperty SubPanelProperty = DependencyProperty.Register(
            nameof(SubPanel),
            typeof(object),
            typeof(RadioButtonCC), new PropertyMetadata(null));
 
        public object SubPanel
        {
            get { return (object)GetValue(SubPanelProperty); }
            set { SetValue(SubPanelProperty, value); }
        }
 
 
        #region SubPanelVisibility
        public static readonly DependencyProperty SubPanelVisibilityProperty = DependencyProperty.Register(
                   nameof(SubPanelVisibility),
                   typeof(Visibility),
                   typeof(RadioButtonCC), new PropertyMetadata(Visibility.Collapsed));
 
 
        public Visibility SubPanelVisibility
        {
            get { return (Visibility)GetValue(SubPanelVisibilityProperty); }
            set { SetValue(SubPanelVisibilityProperty, value); }
        }
        #endregion
    }
}
Но анимация у нас заточена на свойстве IsChecked, и сменить SubPanelVisibility так просто не получится пока IsChecked равно истине. И в целом это не зачем, нам нужно знать только когда видимость панели у родителя задана. Ведь IsChecked родителя в ситуации клика равен true всегда. Поэтому проверка иного свойства для управления видимостью подходит.


Здесь я вынес анимацию SubPanelVisibility в отдельный BeginStoryboard чтобы оно не зависело от Storyboard.TargetName которое привязано выше к subContent
XML
1
2
3
4
5
6
7
8
9
10
 <Trigger.ExitActions>
     <BeginStoryboard Storyboard="{StaticResource SubContentExitResource}"></BeginStoryboard>
     <BeginStoryboard>
         <Storyboard>
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(local:RadioButtonCC.SubPanelVisibility)">
                 <DiscreteObjectKeyFrame KeyTime="0:0:0.1" Value="{x:Static Visibility.Collapsed}" />
             </ObjectAnimationUsingKeyFrames>
         </Storyboard>
     </BeginStoryboard>
 </Trigger.ExitActions>
Для EnterActions сделано тоже самое.

Полный код RadioButtonCC.xaml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:local="clr-namespace:Danilg467RadioButtonCC.CustomControls"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="FocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="2" StrokeDashArray="1 2" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" SnapsToDevicePixels="true" StrokeThickness="1"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="OptionMarkFocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="14,0,0,0" StrokeDashArray="1 2" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" SnapsToDevicePixels="true" StrokeThickness="1"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
 
 
    <Style TargetType="{x:Type local:RadioButtonCC}">
        <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
        <Setter Property="MinHeight" Value="40"></Setter>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
        <Setter Property="VerticalContentAlignment" Value="Center"></Setter>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Padding" Value="14 0 0 0"></Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type RadioButton}">
                    <ControlTemplate.Resources>
                        <Storyboard x:Key="SubContentExitResource" TargetName="subContent">
                            <DoubleAnimation
                                Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                                From="0" To="15" Duration="0:0:0.2"/>
                            <DoubleAnimation
                                Storyboard.TargetProperty="Opacity"
                                From="1.0" To="0" Duration="0:0:0.2"/>
                        </Storyboard>
                    </ControlTemplate.Resources>
                    <Border x:Name="templateRoot"  
                            Background="{TemplateBinding Background}" 
                            SnapsToDevicePixels="True">
                        <Grid VerticalAlignment="Center">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <ContentPresenter x:Name="contentPresenter" MinHeight="{TemplateBinding MinHeight}" Grid.Row="0" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            <ContentControl Name="subContent"  Visibility="{Binding SubPanelVisibility, RelativeSource={RelativeSource AncestorType=local:RadioButtonCC}}" Content="{Binding SubPanel, RelativeSource={RelativeSource AncestorType=local:RadioButtonCC}}" Grid.Row="1" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                <ContentControl.RenderTransform>
                                    <TranslateTransform X="0" />
                                </ContentControl.RenderTransform>
                            </ContentControl>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter Property="Background" TargetName="templateRoot" Value="#D3D3D3D3"/>
                            <Trigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard TargetName="subContent">
                                        <DoubleAnimation
                                             Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                                             From="15" To="0" Duration="0:0:0.3"/>
                                        <DoubleAnimation
                                             Storyboard.TargetProperty="Opacity"
                                             From="0" To="1.0" Duration="0:0:0.3"/>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(local:RadioButtonCC.SubPanelVisibility)">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0.1" Value="{x:Static Visibility.Visible}" />
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(local:RadioButtonCC.SubPanelVisibility)">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0.1" Value="{x:Static Visibility.Visible}" />
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.EnterActions>
 
                            <Trigger.ExitActions>
                                <BeginStoryboard Storyboard="{StaticResource SubContentExitResource}"></BeginStoryboard>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(local:RadioButtonCC.SubPanelVisibility)">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0.1" Value="{x:Static Visibility.Collapsed}" />
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.ExitActions>
                        </Trigger>
 
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Background" TargetName="templateRoot" Value="#D3D3D3D3"/>
                            <Setter Property="Cursor" Value="Hand"></Setter>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="templateRoot" Value="#D3D3D3D3"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
Так как у вас в панельке может быть хоть я не стал типизировать контрол только на одних RadioButton, и делать нечто как Items подобное ListBox. А использовал Attached Property чтобы расширить возможности.

Код хеллпера, код закомментирован.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System.Windows;
using System.Windows.Media;
 
 
namespace Danilg467RadioButtonCC.CustomControls
{
    public class RadioButtonHellper
    {
        #region ResetChildIsChecked
        /// <summary>
        /// Свойство для регистрации IsChecked родительского элемента
        /// при изменение значения он сбрасывает значения RadioButtonCC.IsChecked  дочерних элементов в false
        /// </summary>
        public static readonly DependencyProperty ResetChildIsCheckedProperty = DependencyProperty.RegisterAttached(
                    "ResetChildIsChecked",
                    typeof(bool),
                    typeof(RadioButtonHellper),
                    new PropertyMetadata(false, OnResetChildIsCheckedChanged));
 
        public static void SetResetChildIsChecked(DependencyObject element, bool value) => element.SetValue(ResetChildIsCheckedProperty, value);
 
        public static bool GetResetChildIsChecked(DependencyObject element) => (bool)element.GetValue(ResetChildIsCheckedProperty);
 
        private static void OnResetChildIsCheckedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is RadioButtonCC radioButton && !(bool)e.NewValue)
            {
                var temp = FindVisualChildren<RadioButtonCC>(radioButton);
                foreach (var child in temp)
                {
                    child.IsChecked = false; // Выключаем видимость SubPanel
                }
            }
        }
        #endregion
 
 
        #region RadioButtonCCHideClick
        /// <summary>
        /// Свойство для регистрации события Click,
        /// при изменение клике он сбрасывает значения RadioButtonCC.IsChecked  дочерних элементов в false если SubPanelVisibility видима.
        /// </summary>
        public static readonly DependencyProperty RadioButtonCCHideClickProperty = DependencyProperty.RegisterAttached(
                    "RadioButtonCCHideClick",
                    typeof(bool),
                    typeof(RadioButtonHellper),
                    new PropertyMetadata(false, OnRadioButtonCCHideChanged));
 
        public static void SetRadioButtonCCHideClick(DependencyObject element, bool value) => element.SetValue(RadioButtonCCHideClickProperty, value);
 
        public static bool GetRadioButtonCCHideClick(DependencyObject element) => (bool)element.GetValue(RadioButtonCCHideClickProperty);
 
        private static void OnRadioButtonCCHideChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is RadioButtonCC radioButton)
            {
                //Регистрируем событие Click
                radioButton.Click += (sender, args) =>
                {
                    if (args.OriginalSource != radioButton) //Если событие вызвано не кнопкой у которой задано событие, то прекращаем выполнение.
                        return;
                    if (radioButton.SubPanelVisibility == Visibility.Visible) //Если задана видимость, выполняем поиск и деактивируем видимость.
                    {
                        var temp = RadioButtonHellper.FindVisualChildren<RadioButtonCC>(radioButton);
                        foreach (var child in temp)
                        {
                            if (radioButton.SubPanelVisibility == Visibility.Visible)
                                child.IsChecked = false;
                        }
                    }
                };
            }
        }
        #endregion
 
 
        /// <summary>
        /// Поиск дочерних элементов
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="depObj"></param>
        /// <returns></returns>
        public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
        {
            if (depObj != null)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                    if (child != null && child is T)
                    {
                        yield return (T)child;
                    }
 
                    foreach (T childOfChild in FindVisualChildren<T>(child))
                    {
                        yield return childOfChild;
                    }
                }
            }
        }
    }
}

Использование, задание для сброса IsChecked при изменение родительского IsCheked ResetChildIsChecked
и RadioButtonCCHideClick для обработки клика по элементу.
XML
1
2
 control:RadioButtonHellper.ResetChildIsChecked="{Binding IsChecked, RelativeSource={RelativeSource Self}}"
 control:RadioButtonHellper.RadioButtonCCHideClick="True"
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<control:RadioButtonCC  x:Name="test"
                      Margin="0 15 0 0" 
                      control:RadioButtonHellper.ResetChildIsChecked="{Binding IsChecked, RelativeSource={RelativeSource Self}}"
                      control:RadioButtonHellper.RadioButtonCCHideClick="True"
                      Command="{x:Static local:Navigator.NavigatorCurrentViewCommand}" 
                      CommandParameter="CategoriesVM" Checked="test_Checked">
    <control:RadioButtonCC.Content>
        <TextBlock VerticalAlignment="Center">Categories</TextBlock>
    </control:RadioButtonCC.Content>
 
    <control:RadioButtonCC.SubPanel>
        <StackPanel>
            <control:RadioButtonCC 
                Margin="0 15 0 0" 
                x:Name="ButtonCc">
                <control:RadioButtonCC.Content>
                    <TextBlock VerticalAlignment="Center">Панель 1</TextBlock>
                </control:RadioButtonCC.Content>
 
                <control:RadioButtonCC.SubPanel>
                    <Border Height="30" Background="DarkCyan">
                        <TextBlock VerticalAlignment="Center">SubPanel</TextBlock>
                    </Border>
                </control:RadioButtonCC.SubPanel>
            </control:RadioButtonCC>
 
            <control:RadioButtonCC Margin="0 15 0 0">
                <control:RadioButtonCC.Content>
                    <TextBlock VerticalAlignment="Center">Панель 2</TextBlock>
                </control:RadioButtonCC.Content>
 
                <control:RadioButtonCC.SubPanel>
                    <Border Height="30" Background="DarkCyan">
                        <TextBlock VerticalAlignment="Center">SubPanel</TextBlock>
                    </Border>
                </control:RadioButtonCC.SubPanel>
            </control:RadioButtonCC>
        </StackPanel>
    </control:RadioButtonCC.SubPanel>
</control:RadioButtonCC>
Результат

Исходник
Danilg467RadioButtonCC.rar
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
26.05.2024, 09:07
Цитата Сообщение от Danilg467 Посмотреть сообщение
RadioButton
Цитата Сообщение от xellan24rus Посмотреть сообщение
Автор о самой реализации и суть использования, есть RadioButton у него есть выпадающая панель.
Без обит пацаны, но вы явно "не в ту степь прёте".
В WPF элементы выбираются по ПОВЕДЕНИЮ. Это один из камней базового фундамента WPF. Это одна из причин разделения всех элементов на две части: Custom Control - код Шарпа с поведением, и Базовый Стиль (Шаблон элемента) - XAML в теме подключаемый автоматичиски.

Для кнопки (ButtonBase) - одно из поведений это поднятие Click в элементе по MouseLeftButtonDown/Up. В них даже события MouseLeftButton из-за этого не всплывают. Click в кнопке возникает при нажатии на любой элемент входящий в состав кнопки. А вашей реализации, все разворачивающиеся элементы, входят в состав кнопки. Поэтому клик на на них, по поведению - это и клик на самой кнопке родителе. Придумывать дикие костыли, для того чтобы изменить базовое поведение, ну как бы это "выстрел себе в ногу".

Добавлено через 9 минут
Цитата Сообщение от Danilg467 Посмотреть сообщение
https://github.com/GrigorevDan... nceWPF.git
Реп недоступен.
Удалили его что ли?
0
2 / 2 / 0
Регистрация: 13.05.2023
Сообщений: 42
26.05.2024, 09:49  [ТС]
xellan24rus, Чувак ты реально гений. Это работает, я очень тебе благодарен за помощь. Но я так понял что не получается сменить значение главной на IsChecked false при переключении на подраздел?

Добавлено через 6 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Удалили его что ли?
в нем нет необходимости, поэтому удалил
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
26.05.2024, 16:35
Цитата Сообщение от Элд Хасп Посмотреть сообщение
но вы явно "не в ту степь прёте".
Более лучшую реализацию я вижу с TreeView, но и в нем бы пришлось использовать Radio Button, так как поведение зависит от выбранного элемента. Только 1 элемент группы\подгруппы может быть true, а родителем может быть как элемент, так и любой под элемент. Или с самописным контролом где можно в элемент размещать под элементы состоящих из элементов и под элементов. И при этом для условий видимости для элементов и под элементов задавать не object, а конкретную панель с нужными dp. Выходит что в обоих случаях пришлось бы делать свойство IsChecked. И подобно SelectionChanged затем перебирать эти панели и управлять видимостью, также поднимая события click.
Выходит что легче всего унаследовать ListBox для подобного и при IsSelected - false убирать видимость у панельки, и также переводить IsChecKed в false. Тем самым только контент можно будет размещать, доступа из вне к Radio Button не будет который является под элементами.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Удалили его что ли?
А его и запустить нельзя было.

Цитата Сообщение от Danilg467 Посмотреть сообщение
Но я так понял что не получается сменить значение главной на IsChecked false при переключении на подраздел?
В данной ситуации так не получится, так как вся логика завязана на IsChecked. И в целом для представления не нужны такие зависимые свойства из вне. Сейчас над этим контроль только идет от главного IsChecked для дочерних. В рамках вопроса там может быть хоть что это подходит, так как при помощи ap идет контроль видимости, то есть к нему есть прямой доступ. Но если задача была бы по представлению подобного treewView с вашими условиями, то все доступно было бы из под коробки, и ap был бы совсем не нужен. В данном ответе есть просто кнопка с панелькой. А всем остальным заправляет ap. Выходит что custom control обычная кнопка с панелькой. Для того чтобы сделать его полноценным контролом нужно чтобы там были конкретные элементы и под элементы, нужно основательно менять логику на другую.

Цитата Сообщение от Danilg467 Посмотреть сообщение
Это работает
Верно, но в использование не очень удобно, ведь логическая часть висит на ap, скорее это пример с ap, как при помощи этого можно внедрить доп логику в элемент.
Для массового использования это не удобно, так как под массовым использованием писать самому ap такое себе, хотелось бы использовать готовое из под коробки сразу.


И все таки почему реализация должна быть только на Radio Button? Зачем вам нужен контроль и биндинг к IsSelected? Сделать я сделал, но не понял зачем такое использовать Для дашбоарда такое избыточно, а для какого то дерева элементов, может быть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.05.2024, 16:35

Кнопка на первой форме и radiobutton на второй форме
доброго времени суток как связать кнопку из 1-й формы с radiobutton на 2-й ? пробовал так: void __fastcall...

Проблемы с анимацией
Здравствуйте. Может кто сталкивался с такой проблемой. Когда персонаж садится на стул и начинается новая анимация, он уезжает вперед. В...

Проблемы с анимацией
&lt;!DOCTYPE html&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;title&gt;&lt;/title&gt; &lt;style&gt; @import...

Проблемы с анимацией
Здравствуйте уважаемые форумчане! Помогите пожалуйста с курсовой работой. C++ изучаю совсем недавно и с анимацией пока не встречался....

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru