Не удается получить эффект, работая в ControlTemplate - PullRequest
0 голосов
/ 28 марта 2012

Я должен признаться, что сложная работа ControlTemplates - это не то, о чем я уже готов написать книги.: O)

В любом случае, я написал пользовательскую кнопку (там должно быть несколько таких), чтобы соответствовать потребностям HMI (Human Machine Interface) клиента и, конечно, я предоставилControlTemplate для этого.

Кнопка всегда отображает черную тень, но теперь я хочу, чтобы тень меняла цвет, когда кнопка становится «горячей», например, когда мышь над ней (класс кнопки - HmiToolbarButton -поддерживает d-свойство с именем "IsHot").

Вот (нерабочий) шаблон:

 <Style TargetType="{x:Type local:HmiToolbarButton}">
    <Setter Property="AutoSize" Value="False" />
    <Setter Property="HotBehaviorNormal" Value="True" />
    <Setter Property="HorizontalAlignment" Value="Center" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:HmiToolbarButton}">
                <Grid x:Name="_grd">
                    <Border 
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        >
                        <ContentPresenter x:Name="PART_CONTENT" />
                    </Border>
                    <local:ButtonHotDecorator IsHitTestVisible="False" IsChecked="{TemplateBinding IsChecked}" IsMouseOver="{TemplateBinding IsHot}" IsEnabled="{TemplateBinding HotBehaviorNormal}" />
                    <Grid.Effect>
                        <DropShadowEffect ShadowDepth="0" Opacity="0.9" BlurRadius="10" Color="{TemplateBinding DropShadowColor}" />
                    </Grid.Effect>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsHot" Value="True">
                        <Setter TargetName="_grd" Property="Effect">
                            <Setter.Value>
                                <!-- *** PROBLEM HERE *** -->
                                <DropShadowEffect 
                                    ShadowDepth="0" Opacity="0.9" BlurRadius="10" 
                                    Color="{TemplateBinding HotDropShadowColor}" 
                                    />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Черная тень работает нормально, но я не получаю никакого эффекта, когдаЯ перемещаю мышь над кнопкой.Я подозреваю, что TemplateBinding не работает, потому что, если я изменю его на постоянный цвет, эффект отобразится, как и ожидалось.

Любые подсказки будут оценены.

Спасибо

1 Ответ

3 голосов
/ 29 марта 2012

Иногда TemplateBinding имеет проблемы с разрешением, когда он не находится непосредственно внутри самого шаблона. Здесь вы используете его в создании нового объекта внутри Setter внутри Trigger, так что, вероятно, в этом и заключается проблема. Попробуйте использовать RelativeSource вместо того, что в триггере:

<DropShadowEffect 
  ShadowDepth="0" Opacity="0.9" BlurRadius="10" 
  Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HotDropShadowColor}" 
  />
...