Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF Trigger - применить другой фон / 21 сообщений из 21, страница 1 из 1
18.04.2016, 10:13
    #39217834
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
Украшаю табстрип на основе примера, найденного в интернетах.

Код: 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
18.04.2016, 11:21
    #39217907
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
То ли ты невнятно объяснил, то ли я плохо соображаю.
Ты хочешь менять Fill у Path? Так прикрути триггер к Path.
...
Рейтинг: 0 / 0
18.04.2016, 11:37
    #39217933
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
Shocker.Pro Ты хочешь менять Fill у Path?Да.

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

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

Код: 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
18.04.2016, 14:40
    #39218182
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
мне кажется, самое время освоить такое свойство
как Trigger.SourceName и Setter.TargetName
и будет счастье :)

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

для просты понимания, размести триггер в ContolTemplate.Triggers,
триггер повесь на свойство IsSelected (если SourceName не указан используются свойства родителя шаблона
а значение меняй у объект Path через Setter c TargetNameСпасибо это помогло. До этого пытался без TargetName туда тыкаться, но не смог добраться до Path.
...
Рейтинг: 0 / 0
18.04.2016, 15:23
    #39218265
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
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
22.04.2016, 09:57
    #39222088
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
Код: 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
22.04.2016, 10:31
    #39222128
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
А хотя так не будет работать, <Button Background="#"> все равно приоритетней и не даст триггеру перекрасить фон.

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

или

2. Наследуй стили - вынеси дефолтный цвет в базовый стиль.
...
Рейтинг: 0 / 0
22.04.2016, 11:03
    #39222170
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
Код: 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
22.04.2016, 11:03
    #39222172
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
Код: 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
22.04.2016, 12:27
    #39222307
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Trigger - применить другой фон
В общем примерно так и сделал:
Код: 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
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF Trigger - применить другой фон / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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