Сеттер для элементов внутри ContentPresenter

У меня есть ControlTemplate вот так:

<ControlTemplate TargetType="Button">
    <Grid Background="Transparent">
        <ContentPresenter x:Name="contentPresenter" HorizontalAlignment="Center"
                          VerticalAlignment="Center" />
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect BlurRadius="20" Color="Black" ShadowDepth="0"
                                      Opacity="0.5" />
                </Setter.Value>
            </Setter>
            <Setter Property="FontWeight" Value="SemiBold"/>
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect BlurRadius="20" Color="Black" ShadowDepth="0" Opacity="1" />
                </Setter.Value>
            </Setter>
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="Gray" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Когда свойство IsMouseOver изменяется на True, я хочу, чтобы все изображения внутри contentPresenter имели эффект DropShadowEffect, а не сама кнопка.
Я пытался изменить свойство setter на Image.Effect, но это не работает.
Что мне делать? Это?

Вот как выглядит моя кнопка, когда мышь закончилась: введите здесь описание изображения
А вот так оно выглядит, когда его нет: введите здесь описание изображения
Как видите, и Image, и TextBlock получают эффект тени. Но я хочу, чтобы его получил только образ.


person wingerse    schedule 22.01.2016    source источник
comment
Я неправильно понял вашу проблему, игнорируйте мои предыдущие комментарии. Что не работает? Можете ли вы прикрепить скриншот, чтобы продемонстрировать проблему?   -  person Sinatr    schedule 22.01.2016
comment
@Sinatr Я отредактировал вопрос и добавил несколько скриншотов.   -  person wingerse    schedule 22.01.2016


Ответы (2)


Вы можете взять стиль, рекомендованный Sinatr, и поместить его в раздел ControlTemplate.Resources шаблона управления вашей кнопкой. Вот пример, который сработал для меня. Он также обрабатывает событие IsPressed, во время которого, я предполагаю, вы хотите настроить эффект тени только для изображения:

<ControlTemplate x:Key="BtnTemplate" TargetType="{x:Type Button}">
    <Grid Background="Transparent">
        <ContentPresenter x:Name="contentPresenter" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>

    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="FontWeight" Value="SemiBold"/>
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="Gray" />
        </Trigger>
    </ControlTemplate.Triggers>

    <ControlTemplate.Resources>
        <Style TargetType="{x:Type Image}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Button}}" Value="True">
                    <DataTrigger.Setters>
                        <Setter Property="Effect">
                            <Setter.Value>
                                <DropShadowEffect BlurRadius="20" Color="Black" ShadowDepth="0" Opacity="0.5"/>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger.Setters>
                </DataTrigger>

                <DataTrigger Binding="{Binding IsPressed, RelativeSource={RelativeSource AncestorType=Button}}" Value="True">
                    <DataTrigger.Setters>
                        <Setter Property="Effect">
                            <Setter.Value>
                                <DropShadowEffect BlurRadius="20" Color="Black" ShadowDepth="0" Opacity="1" />
                            </Setter.Value>
                        </Setter>
                    </DataTrigger.Setters>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ControlTemplate.Resources>
</ControlTemplate>
person mvromer    schedule 22.01.2016

Вам действительно не нужно определять шаблон Button, а лучше создать стиль Image

<Style x:Key="style"
       TargetType="Image">
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Button}}"
                     Value="True">
            <DataTrigger.Setters>
                <Setter Property="Effect">
                    <Setter.Value>
                        <DropShadowEffect BlurRadius="20"
                                          Color="Black"
                                          ShadowDepth="0"
                                          Opacity="0.5" />
                    </Setter.Value>
                </Setter>
            </DataTrigger.Setters>
        </DataTrigger>
   </Style.Triggers>

and apply it to each image you show inside button

<Button>
...
    <Image Style="{StaticResource style}" ... />
...
</Button>
person Sinatr    schedule 22.01.2016
comment
Вы уверены, что это невозможно сделать с помощью ControlTemplate? (Кстати, шаблон элемента управления необходим, потому что я хочу переопределить шаблон кнопки и предоставить свой собственный.) - person wingerse; 22.01.2016
comment
Я предлагаю вам один вариант решения проблемы. Возможно, есть и другие варианты, но я бы сделал именно так. Если бы было много кнопок, как вы показываете, то я, вероятно, получил бы настраиваемый элемент управления (чтобы иметь возможность, по крайней мере, назначать разные изображения изображению кнопки). - person Sinatr; 22.01.2016