Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
1
WPF

Тригер смены стиля

19.05.2020, 05:06. Показов 1074. Ответов 4
Метки mvvm (Все метки)

Author24 — интернет-сервис помощи студентам
В ListBox выводится информация посредством вытягивания из ObservableCollection
C#
1
2
3
        private ObservableCollection<Lot> _lotSelection = new ObservableCollection<Lot>();
        public ObservableCollection<Lot> LotSelection
        { get => _lotSelection; set => SetProperty(ref _lotSelection, value); }
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                        <ListBox Background="{x:Null}" Width="Auto" ItemsSource="{Binding LotSelection}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid Width="250" Margin="10,10,10,0">
 
                                        <Rectangle Height="40" Fill="LightPink" RadiusX="15" RadiusY="15"
                                                   StrokeThickness="3" StrokeDashArray="3 2"
                                                   Stroke="Gray" StrokeDashCap="Round" />
 
                                        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding ShowLot}"/>
 
                                        <StackPanel Orientation="Horizontal" Margin="0,0,3,0" HorizontalAlignment="Right" >
                                            <Button x:Name="Status"  Style="{StaticResource Start}"/>
                                        </StackPanel>
                                    </Grid>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
Есть два стиля кнопки: Start и Stop

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
<Style x:Key="Stop" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Grid>
                            <Border x:Name="border" 
                                    Width="{Binding Value, ElementName=slider}" 
                                    Height="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource Self}}">
 
                                <Viewbox Width="48" Height="48">
                                    <Canvas Width="24" Height="24">
                                        <Path Fill="Black" Data="M18,18H6V6H18V18Z" />
                                    </Canvas>
                                </Viewbox>
                            </Border>
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
 
    <Style x:Key="Start" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid>
                        <Grid>
                            <Border Width="48" 
                                    Height="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource Self}}">
 
                                <Viewbox Width="48" Height="48">
                                    <Canvas Width="24" Height="24">
                                        <Path Fill="Black" Data="M8,5.14V19.14L19,12.14L8,5.14Z" />
                                    </Canvas>
                                </Viewbox>
                            </Border>
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
Рядом с каждым выведенным TextBlock'ом есть кнопка "Status". Как можно заметить, она принимает стиль Start по умолчанию, но хотелось бы чтобы она зависила от свойства Status из коллекции LotSelection.
Status, в свою очередь, может принимать 2 значения: "paused" или "started".
Обобщу: если Status(свойство) равно "paused", то кнопка Status должна принять стиль "Start", если "started" -- "Stop"
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2020, 05:06
Ответы с готовыми решениями:

Тригер для смены цвета
Есть 2 кнопки &lt;Button Content=&quot;Какая-то кнопка&quot; Style=&quot;{StaticResource LineButton}&quot;/&gt; ...

Стиль в коде. Тригер, как сделать так, чтобы тригер менял кисть на ту, которая в свойстве контрола
Есть код, работает, но мне нужно, чтобыменялся цвет не на жёстко прописанный Red, а на...

Возможность смены темы/стиля приложения в рантайме
Привет всем! Помогите разобраться. Хочу в рантайме иметь возможность смены стиля приложения....

После смены стиля "VCL Styles" форма теряет модальность
Доброго вам! При применении стилей окна, используя void __fastcall...

4
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
19.05.2020, 10:44 2
Лучший ответ Сообщение было отмечено limeniye как решение

Решение

Цитата Сообщение от limeniye Посмотреть сообщение
В ListBox выводится информация посредством вытягивания из ObservableCollection
C#
Если используете ObservableCollection, то это должно быть свойство только для чтения:
C#
1
public ObservableCollection<Lot> LotSelection {get;} = new ObservableCollection<Lot>();
Шаблон данных для элемента списка написан не совсем понятно.
Допустим, зачем в нём StackPanel, если в ней всего один элемент?

Цитата Сообщение от limeniye Посмотреть сообщение
Обобщу: если Status(свойство) равно "paused", то кнопка Status должна принять стиль "Start", если "started" -- "Stop"
Пишу здесь - может быть ошибка, но смысл поймёте
XML
1
2
3
4
5
6
7
8
9
10
11
12
<Button x:Name="Status"  Style="{StaticResource Start}">
   <Button.Style>
       <Style TargetType="Button">
           <Setter Property="Template" Value="{StaticResource Template.Button.Start}"/>
           <Style.Triggers>             
               <DataTriggers Binding="{Binding Status}" Value="started">
                    <Setter Property="Template" Value="{StaticResource Template.Button.Stop"/>
               </DataTriggers>
         </Style.Triggers>             
       </Style>
   </Button.Style>
</Button>
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
                <ControlTemplate TargetType="{x:Type Button}" x:Key="Template.Button.Start">
                    <Grid>
                        <Grid>
                            <Border x:Name="border" 
                                    Width="{Binding Value, ElementName=slider}" 
                                    Height="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource Self}}">
 
                                <Viewbox Width="48" Height="48">
                                    <Canvas Width="24" Height="24">
                                        <Path Fill="Black" Data="M18,18H6V6H18V18Z" />
                                    </Canvas>
                                </Viewbox>
                            </Border>
                        </Grid>
                    </Grid>
                </ControlTemplate>
   
                <ControlTemplate TargetType="{x:Type Button}" x:Key="Template.Button.Stop">
                    <Grid>
                        <Grid>
                            <Border Width="48" 
                                    Height="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource Self}}">
 
                                <Viewbox Width="48" Height="48">
                                    <Canvas Width="24" Height="24">
                                        <Path Fill="Black" Data="M8,5.14V19.14L19,12.14L8,5.14Z" />
                                    </Canvas>
                                </Viewbox>
                            </Border>
                        </Grid>
                    </Grid>
                </ControlTemplate>
0
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
19.05.2020, 11:38 3
Думаю, будет правильно переключать не стиль, а в самом стиле переключать ControlTemplate. Это уменьшит количество дублирующегося кода.
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
19.05.2020, 11:48 4
Цитата Сообщение от ViterAlex Посмотреть сообщение
Думаю, будет правильно переключать не стиль, а в самом стиле переключать ControlTemplate. Это уменьшит количество дублирующегося кода.
Согласен.
Но надо было включать Студию...
Сделал вариант с минимальными изменениями.
0
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
20.05.2020, 01:28  [ТС] 5
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Допустим, зачем в нём StackPanel, если в ней всего один элемент?
Там больше элементов, я упростил. В данном случае StackPanel можно и вовсе удалить оставив содержимое.

Добавлено через 10 минут
Спасибо
0
20.05.2020, 01:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2020, 01:28
Помогаю со студенческими работами здесь

Создание стиля ссылки для стиля
Известно как создать стиль ссылки для всего документа (который применяется если убрать...

тригер
Можно ли в тригере зделать update? если да то как?

Тригер
БД «Мировые рыбные ресурсы» Тригер: розробити тригер на додання/зміну записів у таблиці «Рыбы»,...

Тригер + селект
Необходимо создать тригер обеспечивающий проверку вводимых данных. Например имеется 2 таблицы:...

Тригер в SQLlite
Как написать тригер, который будет заполнять столбец, взяв значения из столбца &quot;стоимость&quot; и &quot;год ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru