我有一个ToggleButton,我点击它来弹出FlowDocumentReader作为Adorner。此FlowDocument是ControlTemplate的一部分,带有DataTrigger以显示/隐藏元素。
使用以下触发器一切正常。我使用DataTrigger和一些Setter,当我检查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>
故事板上下文与Setter完全不同吗?为什么它在一个地方工作,而不是另一个地方呢?
奇怪的是,当我进行此更改时,它会导致绑定错误显示在输出窗口中。我没有触及DataTrigger的实际绑定,只是内容:
System.Windows.Data错误:4:找不到绑定源 引用'ElementName = adorner'。 BindingExpression:路径= AdornedElement.IsChecked;的DataItem = NULL;目标 element是'Control'(Name =''); target属性是'NoTarget'(类型 '对象')
以下是模板其余部分的一般概念:
<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>
答案 0 :(得分:2)
我认为在你的情况下你应该使用Trigger而不是DataTrigger。 DataTrigger用于绑定应用DataTemplate的元素的DataContext中的某些数据。
我建议您尝试以这种方式使用Trigger:
<Trigger SourceName="adorner" Property="AdornedElement.IsChecked" Value="True">
...
</Trigger>