2011-04-19 96 views
1

我有以下的(简化)控件模板:在ControlTemplate的触发器中,如何访问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

回答

1

无法按名称访问它,因为ScaleTransform不是可见树中的元素,它只是元素属性的值(Grid)。

你可以做的是通过定义它的父元素访问转换的属性。例如:

<DoubleAnimation Storyboard.TargetName="Grid" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)" .../> 
+0

括号内的语法不起作用,但它确实似乎是在这里使用Storyboard。顺便说一句,我通过使用VisualStateManager而不是触发器来更好地完成我的最终目标。无论如何,+1的视觉树提示。 – ForeverLearnNeverMaster 2011-04-19 13:11:56

1

我认为,问题在于ScaleTransform不是Visual元素。所以它不能在VisualTree中找到。您应该尝试在网格上设置触发器并更改整个ScaleTransform。

相关问题