访问ControlTemplate中的内部元素

时间:2011-05-23 12:30:49

标签: wpf triggers controltemplate xname

这是我的代码:

<ControlTemplate TargetType="{x:Type ToggleButton}">
    <Border x:Name="Chrome">
        <Grid x:Name="Arrow">
            <Grid.Background>
                <DrawingBrush Viewport="0,0,4,4" Viewbox="0,-0.4,16,16" ViewboxUnits="Absolute">
                    <DrawingBrush.Drawing>
                        <GeometryDrawing x:Name="ArrowDrawing">
                            <GeometryDrawing.Geometry>
                                <PathGeometry>
                                    <PathFigure StartPoint="1,1" IsClosed="True">
                                        <LineSegment Point="2,2.45"/>
                                        <LineSegment Point="3,1"/>
                                        <LineSegment Point="2,1.75"/>
                                    </PathFigure>
                                </PathGeometry>
                            </GeometryDrawing.Geometry>
                        </GeometryDrawing>
                    </DrawingBrush.Drawing>
                </DrawingBrush>
            </Grid.Background>
        </Grid>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Brush" TargetName="ArrowDrawing" Value="{StaticResource DisabledForecolor}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

因此,当触发器触发时(编译时),我收到错误:

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

如何从触发器实际访问名为GeometryDrawing的{​​{1}}?

2 个答案:

答案 0 :(得分:3)

实际上有两种方法可以实现这一点,一种是使用绑定:

Storyboard.Target="{Binding ElementName=ContentPopup}"

另一个是使用XAML内部引用:

Storyboard.Target="{x:Reference Name=ContentPopup}"

同样的答案是here

答案 1 :(得分:2)

This post可能有帮助

  

但是,有一种方法可以解决这个问题,   通过使用数据绑定。有了   绑定,你可以找到自己的出路   刷到一个元素,然后   Setter可以定位该元素。