Как в триггере ControlTemplate получить доступ к элементу, определенному в теле ControlTemplate? - PullRequest
1 голос
/ 19 апреля 2011

У меня есть следующий (упрощенный) ControlTemplate:

<ControlTemplate x:Key="ImageButtonTemplate" TargetType="{x:Type controls:ImageButton}">
    <Grid x:Name="Grid">
      <Border [StuffRemoved]/>
      <StackPanel [StuffRemoved]>
        <Image [StuffRemoved] />
        <ContentPresenter [StuffRemoved] />
      </StackPanel>      

        <Grid.RenderTransform>
            <ScaleTransform x:Name="ImgBtnScale"/>
        </Grid.RenderTransform>
    </Grid>

    <ControlTemplate.Triggers>

        <!-- problem here! -->
        <Trigger Property="IsPressed" Value="True">
            <Trigger.Setters>
                <Setter  TargetName="ImgBtnScale" Property="ScaleX" Value="0.9"/>
                <Setter TargetName="ImgBtnScale" Property="ScaleY" Value="0.9"/>
            </Trigger.Setters>
        </Trigger>      


        <!-- rest of the stuff works okay-->

        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="ImgBtnScale" Storyboard.TargetProperty="ScaleX"
                            To="1.2" Duration="0:0:0.1"/>
                        <DoubleAnimation Storyboard.TargetName="ImgBtnScale" Storyboard.TargetProperty="ScaleY"
                            To="1.2" Duration="0:0:0.1"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>

            <Trigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="ImgBtnScale" Storyboard.TargetProperty="ScaleX"
                            To="1" Duration="0:0:0.1"/>
                        <DoubleAnimation Storyboard.TargetName="ImgBtnScale" Storyboard.TargetProperty="ScaleY"
                            To="1" Duration="0:0:0.1"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.ExitActions>      
        </Trigger>

    </ControlTemplate.Triggers>
  </ControlTemplate>

Он не компилируется, говоря, что:

Cannot find the target 'ImgBtnScale'. (The target must appear before any Setters, Triggers or Conditions that use it.)

Так как мне получитьImgBtnScale

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Я думаю, проблема в том, что ScaleTransform не является визуальным элементом. Так что его нельзя найти в VisualTree. Вы должны попытаться установить триггер на сетке и изменить весь ScaleTransform.

1 голос
/ 19 апреля 2011

Вы не можете получить к нему доступ по имени, потому что ScaleTransform не является элементом в визуальном дереве, это просто значение свойства элемента (Grid).

Вместо этого вы можете получить доступ к свойству преобразования через родительский элемент, в котором оно определено. Например:

<DoubleAnimation Storyboard.TargetName="Grid" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" .../>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...