C# 如何在ControlTemplate的ControlTemplate之外获取对ControlTemplate内控件的引用?

C# 如何在ControlTemplate的ControlTemplate之外获取对ControlTemplate内控件的引用?,c#,wpf,C#,Wpf,在一个控件的ControlTemplate中,我正在定义另一个控件的ControlTemplate,我想从外部ControlTemplate获取对列表框lstBx的引用, 既不起作用:Storyboard.TargetName=“lstBx”也不起作用: Storyboard.Target="{Binding ElementName=lstBx, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}

在一个控件的
ControlTemplate
中,我正在定义另一个控件的
ControlTemplate
,我想从外部
ControlTemplate
获取对列表框
lstBx
的引用, 既不起作用:
Storyboard.TargetName=“lstBx”
也不起作用:

Storyboard.Target="{Binding ElementName=lstBx, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"
这是我的代码的简化版本

<ControlTemplate TargetType="{x:Type ContentControl}" x:Name="cont">
    <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>
        <Border Canvas.ZIndex="1" CornerRadius="4" BorderThickness="1" BorderBrush="Black" Background="{StaticResource btn3d}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="32" />
                    <ColumnDefinition Width="1" />
                    <ColumnDefinition Width="2*" />
                </Grid.ColumnDefinitions>
                <ToggleButton Padding="30, 10">
                    <ToggleButton.Template>
                        <ControlTemplate TargetType="ToggleButton">
                            <ControlTemplate.Triggers>
                                <EventTrigger RoutedEvent="ToggleButton.Checked">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="lstBx" Storyboard.TargetProperty="Height" From="0" To="60" Duration="0:0:0.5" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </ToggleButton.Template>
                </ToggleButton>
                <StackPanel Grid.Column="2" />
            </Grid>
        </Border>
        <ListBox Name="lstBx" Height="0" Grid.Row="1" ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource}" />
    </Grid>
</ControlTemplate>

虽然无法执行此类绑定,但您可以使用一些代理。 例如,您可以绑定到
ToggleButton
标记
属性:

<ControlTemplate TargetType="{x:Type ContentControl}" x:Name="cont">
<Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
    </Grid.RowDefinitions>
    <Border Canvas.ZIndex="1" CornerRadius="4" BorderThickness="1" BorderBrush="Black" Background="{StaticResource btn3d}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="32" />
                <ColumnDefinition Width="1" />
                <ColumnDefinition Width="2*" />
            </Grid.ColumnDefinitions>
            <ToggleButton Name="toggleButton" Padding="30, 10">
                <ToggleButton.Template>
                    <ControlTemplate TargetType="ToggleButton">
                        <ControlTemplate.Triggers>
                            <EventTrigger RoutedEvent="ToggleButton.Checked">
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetProperty="Tag" From="0" To="60" Duration="0:0:0.5" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </ToggleButton.Template>
            </ToggleButton>
            <StackPanel Grid.Column="2" />
        </Grid>
    </Border>
    <ListBox Name="lstBx" Height="{Binding ElementName="toggleButton" Grid.Row="1" ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource}" />
</Grid>
</ControlTemplate>