powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF Trigger - применить другой фон
21 сообщений из 21, страница 1 из 1
WPF Trigger - применить другой фон
    #39217834
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Украшаю табстрип на основе примера, найденного в интернетах.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TabItem">
                    <Grid x:Name="grd" Margin="0 2 0 0">
                        <Path x:Name="TabPath" StrokeThickness="0" Fill="{StaticResource TabItemPathBrush}" Stroke="{StaticResource BorderBrush}"
                              Margin="{Binding ElementName=TabItemContent, Converter={x:Static local:ContentToMarginConverter.Value}}"
                              Data="{Binding ElementName=TabItemContent, Converter={x:Static local:ContentToPathConverter.Value}}">
                        </Path>
                        <ContentPresenter x:Name="TabItemContent" ContentSource="Header" Margin="12,0,10,2" VerticalAlignment="Center" TextElement.Foreground="{StaticResource ForegroundBrush}"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="Selector.IsSelected" Value="True">
                            <Setter Property="BitmapEffect"><Setter.Value><DropShadowBitmapEffect Direction="0" Opacity="0.4" ShadowDepth="3" Softness="1"/></Setter.Value></Setter>
                            <Setter Property="Panel.ZIndex" Value="2"/>
                        </Trigger>
                        <Trigger Property="Selector.IsSelected" Value="False">
                            
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

Как видно из кода, на заголовок выбранной закладки накладывается BitmapEffect. Эта пакость обладает двумя минусами: бросает тень на саму закладку и размывает подпись. Хочу от нее избавиться, а выбранность обозначать более светлым градиентом. Стандартная заливка указана в TabItemPathBrush, и вот никак догнать не могу, как ее поменять в триггере.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39217907
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То ли ты невнятно объяснил, то ли я плохо соображаю.
Ты хочешь менять Fill у Path? Так прикрути триггер к Path.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39217933
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro Ты хочешь менять Fill у Path?Да.

Shocker.ProТак прикрути триггер к Path.Как? У Path нет <ControlTemplate.Triggers>
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218085
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я использовал для этого Shape, Shape на много удобнее тем, что я могу фигуру настроить под размеры, а не размеры под фигуру :)
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218098
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вообще при работе с треггерами надо чётко понимать, что триггеры можно запихнуть как в сам базовый стиль, так и в шаблон.
В стиле мы меняем состояние контрола с помощью свойств контрола, а в шаблоне с помощью свойств его компонентов. И если в контроле используется базовая связка Background\Foreground или Fill\Stroke, то смысла городить такие биндинги и триггеры нет.
Внутри шаблона можно просто привязать из через TemplateBinding к свойствам элемента этого шаблона и управлять ими с помощью стиля.
Есть еще VisualManager, как я понял в WPF он достался от Silverlight по наследству. Сам я им пользуюсь крайне редко, так как получается громоздко, использовать можно только Storyboard, а дискретная анимация это полная жопа, писанины тонна. Возможно такой способ хорошо подойдет для Blend'а, но я редко в нём работаю.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218116
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyShocker.ProТак прикрути триггер к Path.Как? У Path нет <ControlTemplate.Triggers>У Path есть Style, у Style есть Triggers
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218121
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesя использовал для этого Shape, Shape на много удобнее тем, что я могу фигуру настроить под размеры, а не размеры под фигуру :)В моем случае всё сложно в этом плане :)
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218124
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyпропущено...
Как? У Path нет <ControlTemplate.Triggers>У Path есть Style, у Style есть TriggersПодтупливаю пока, поискать Style внутри Path догадался, а написать Path.Style нет.

Теперь окончательно дошло, что <xxx><yyy/></xxx> это контент, а <xxx><xxx.yyy/></xxx> это свойства родителя.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218170
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не выходит каменный цветок.
Написал так:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
                        <Path x:Name="TabPath" StrokeThickness="0"
                              Margin="{Binding ElementName=TabItemContent, Converter={x:Static local:ContentToMarginConverter.Value}}"
                              Data="{Binding ElementName=TabItemContent, Converter={x:Static local:ContentToPathConverter.Value}}">
                            <Path.Style>
                                <Style TargetType="Path">
                                    <Style.Triggers>
                                        <Trigger Property="Selector.IsSelected" Value="True" >
                                            <Setter Property="Fill" Value="{StaticResource TabItemPathBrushSel}"/>
                                        </Trigger>
                                        <Trigger Property="Selector.IsSelected" Value="False">
                                            <Setter Property="Fill" Value="{StaticResource TabItemPathBrush}"/>
                                        </Trigger>
                                    </Style.Triggers>
                                </Style>
                            </Path.Style>
                        </Path>

Все табы рисует TabItemPathBrush'ем. Пробовал писать не Selector.IsSelected, а TabItem.IsSelected - тоже самое, TabItemPathBrushSel игнорируется.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218182
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется, самое время освоить такое свойство
как Trigger.SourceName и Setter.TargetName
и будет счастье :)

для просты понимания, размести триггер в ContolTemplate.Triggers,
триггер повесь на свойство IsSelected (если SourceName не указан используются свойства родителя шаблона
а значение меняй у объект Path через Setter c TargetName
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218196
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополню: второй триггер на False необязателен. Значение по умолчанию задается простым Setter-ом в стиле, а значение для IsSelected меняется триггером
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218202
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДополню: второй триггер на False необязателен. Значение по умолчанию задается простым Setter-ом в стиле, а значение для IsSelected меняется триггером
для это надо разобраться в приоритетах DependencyProperty для значений
http://professorweb.ru/my/WPF/base_WPF/level4/4_4.php
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218249
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesмне кажется, самое время освоить такое свойство
как Trigger.SourceName и Setter.TargetName
и будет счастье :)

для просты понимания, размести триггер в ContolTemplate.Triggers,
триггер повесь на свойство IsSelected (если SourceName не указан используются свойства родителя шаблона
а значение меняй у объект Path через Setter c TargetNameСпасибо это помогло. До этого пытался без TargetName туда тыкаться, но не смог добраться до Path.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39218265
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesдля это надо разобраться в приоритетах DependencyProperty для значений
http://professorweb.ru/my/WPF/base_WPF/level4/4_4.php Там недостаточно внятно описано вычисление базового значения. Вот более понятный список (в порядке убывания приоритета):
1. Локальное значение
2. Триггер в шаблоне родителя
3. Шаблон родителя
4. Триггеры в стиле
5. Триггеры в шаблоне
6. Установщики стиля
7. Триггеры стиля темы
8. Установщики стиля темы
9. Наследуемое значение
10. Значение по умолчанию
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39222088
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<ControlTemplate.Triggers>
    <Trigger Property="IsEnabled" Value="True">
        <Setter Property="Background" Value="{Как тут указать значение из свойства Background, указанного в разметке элемента, к которому применяется стиль?}"/>
    </Trigger>
    <Trigger Property="IsEnabled" Value="False">
        <Setter Property="Background" Value="LightGray"/>
    </Trigger>
</ControlTemplate.Triggers>


А то, если использовать лишь триггер для IsEnabled=False, то цвет выключенного элемента не меняется.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39222128
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А хотя так не будет работать, <Button Background="#"> все равно приоритетней и не даст триггеру перекрасить фон.

Как тогда решить задачу, чтобы у включенных кнопок был разный фон, а у выключенных - одинаковый, серый? Не писать же по стилю на каждый цвет.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39222132
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Расписывать шаблоны с триггерами у самих кнопок тоже не хочется.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39222139
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyКак тогда решить задачу, чтобы у включенных кнопок был разный фон, а у выключенных - одинаковый, серый? Не писать же по стилю на каждый цвет.1. Укажи дефолтному фону Transparent, задавай фон у панели, на которой расположены кнопки.

или

2. Наследуй стили - вынеси дефолтный цвет в базовый стиль.
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39222170
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<Style x:Key="DefaultStyle">
    <Setter Property="Background" Value="Red"/>
</Style>

<Style x:Key="RedStyle" BasedOn="{StaticResource DefaultStyle}">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="True" >
            <Setter Property="Background" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>

<Style x:Key="BlueStyle" BasedOn="{StaticResource DefaultStyle}">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="True" >
            <Setter Property="Background" Value="Blue"/>
        </Trigger>
    </Style.Triggers>
</Style>
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39222172
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<Style x:Key="DefaultStyle">
    <Setter Property="Background" Value="Gray"/>
</Style>

<Style x:Key="RedStyle" BasedOn="{StaticResource DefaultStyle}">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="True" >
            <Setter Property="Background" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>

<Style x:Key="BlueStyle" BasedOn="{StaticResource DefaultStyle}">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="True" >
            <Setter Property="Background" Value="Blue"/>
        </Trigger>
    </Style.Triggers>
</Style>
...
Рейтинг: 0 / 0
WPF Trigger - применить другой фон
    #39222307
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем примерно так и сделал:
Код: 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.
    <Style x:Key="BtnDisable" TargetType="{x:Type Button}">
        <Setter Property="Foreground" Value="White"/>
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Background" Value="LightGray"/>
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style x:Key="ButtonYellow" TargetType="{x:Type Button}" BasedOn="{StaticResource BtnDisable}">
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="True">
                <Setter Property="Background" Value="{DynamicResource ResourceKey=YellowClr}"/>
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style x:Key="ButtonBlue" TargetType="{x:Type Button}" BasedOn="{StaticResource BtnDisable}">
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="True">
                <Setter Property="Background" Value="{DynamicResource ResourceKey=BlueClr}"/>
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style x:Key="BtnSearch" TargetType="{x:Type Button}"  BasedOn="{StaticResource ButtonBlue}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Background="{TemplateBinding Background}" CornerRadius="15,15,15,15" >
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Top" x:Name="content" 
                                          Margin="0 2 0 0"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="content" Property="RenderTransform">
                                <Setter.Value>
                                    <TranslateTransform Y="1" X="1"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="BtnAdd" TargetType="{x:Type Button}"  BasedOn="{StaticResource ButtonBlue}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Background="{TemplateBinding Background}" CornerRadius="15,15,15,15" >
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Top" x:Name="content" 
                                          Margin="0 -5 0 0"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="content" Property="RenderTransform">
                                <Setter.Value>
                                    <TranslateTransform Y="1" X="1"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="BtnDial" TargetType="{x:Type Button}"  BasedOn="{StaticResource ButtonYellow}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border Background="{TemplateBinding Background}" CornerRadius="15,15,15,15" >
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Top" x:Name="content"  
                                          Margin="0 3 0 0"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="content" Property="RenderTransform">
                                <Setter.Value>
                                    <TranslateTransform Y="1" X="1"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Получилось три финальные кнопки, две синих и желтая. У всех одинаковый одинаковый бордер и триггер, который зависит от ContentPresenter'а, а потому просто вынести триггер в базовый стиль не получается. Как и бордер, который почему-то может находиться лишь в ControlTemplate. Но хотелось бы и их вынести. Хотя бы триггер как самый объемный элемент стиля.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF Trigger - применить другой фон
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]