从ControlTemplate DataTrigger中执行Storyboard不起作用

3
我有一个ToggleButton,点击它会弹出一个FlowDocumentReader作为装饰器。这个FlowDocument是ControlTemplate的一部分,其中有一个DataTrigger来显示/隐藏元素。
使用以下触发器,一切都很好。我使用了一个DataTrigger和几个Setters,当我检查我的ToggleButton时,我的元素正确显示了高度和宽度:
<ControlTemplate.Triggers>
    <DataTrigger Binding="{Binding ElementName=adorner, Path=AdornedElement.IsChecked}" Value="True" >
        <Setter TargetName="mainBorder" Property="Height" Value="437"></Setter>
        <Setter TargetName="mainBorder" Property="Width" Value="537"></Setter>
    </DataTrigger>
</ControlTemplate.Triggers>

我希望在元素出现时有一些动画效果,因此我尝试使用了Storyboard。但是这并没有起作用,好像什么也没有发生:

<ControlTemplate.Triggers>
    <DataTrigger Binding="{Binding ElementName=adorner, Path=AdornedElement.IsChecked}" Value="True" >
        <DataTrigger.EnterActions>
            <BeginStoryboard>
                <Storyboard Storyboard.TargetName="mainBorder">
                    <DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="Width"  To="537" />
                    <DoubleAnimationUsingKeyFrames BeginTime="0:0:0.2" Duration="0:0:0.3" Storyboard.TargetProperty="Height">
                        <LinearDoubleKeyFrame Value="417" KeyTime="0:0:0.2" />
                        <LinearDoubleKeyFrame Value="437" KeyTime="0:0:0.24" />
                        <LinearDoubleKeyFrame Value="417" KeyTime="0:0:0.3" />
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.EnterActions>
        <DataTrigger.ExitActions>
            <BeginStoryboard>
                <Storyboard Storyboard.TargetName="mainBorder">
                    <DoubleAnimationUsingKeyFrames Duration="0:0:0.2" Storyboard.TargetProperty="Width">
                        <LinearDoubleKeyFrame Value="0" KeyTime="0:0:0.2" />
                    </DoubleAnimationUsingKeyFrames>
                    <DoubleAnimationUsingKeyFrames BeginTime="0:0:0.2" Duration="0:0:0.2" Storyboard.TargetProperty="Height">
                        <LinearDoubleKeyFrame Value="0" KeyTime="0:0:0.2" />
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </DataTrigger.ExitActions>
    </DataTrigger>
</ControlTemplate.Triggers>

Storyboard 上下文与 Setter 完全不同吗?为什么它在一个地方运行而另一个地方却不行?
奇怪的是,当我进行此更改时,会在输出窗口中显示绑定错误。我没有触及 DataTrigger 的实际绑定,只是其内容:

System.Windows.Data Error: 4 : 找不到用于引用 'ElementName=adorner' 的绑定源。BindingExpression:Path=AdornedElement.IsChecked;DataItem=null;target element is 'Control' (Name='');target property is 'NoTarget' (type 'Object')

以下是模板的大致概念:
<ControlTemplate x:Key="LocalHelpWindow">
    <Grid>
        <Grid.RowDefinitions>
        ...
        </Grid.RowDefinitions>
        <help:AdornedPlaceholder x:Name="adorner" Grid.Row="0"/>
        <Border Grid.Row="1"  x:Name="mainBorder">
            ...
        </Border>
    </Grid>
    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding ElementName=adorner, Path=AdornedElement.IsChecked}" Value="True" >
            ...
        </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
1个回答

2

我认为在您的情况下,应该使用Trigger而不是DataTrigger。DataTrigger用于绑定到DataTemplate所应用的元素的DataContext中的某些数据。

我建议您尝试以以下方式使用Trigger:

<Trigger SourceName="adorner" Property="AdornedElement.IsChecked" Value="True">
    ...
</Trigger>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接