在故事板将 IsExpanded 设置为 true 后,Expander 卡住了
Expander getting stuck after IsExpanded set to true by storyboard
所以我有一个扩展器,我希望它具有正常的功能(用它自己的按钮打开和关闭),但我也想要一个不同的按钮在按下时展开它(这个按钮在 header扩展器)。我在 Button.Click 的事件触发器中使用情节提要,但在以这种方式展开后,普通按钮不起作用,它只是保持展开状态。我的 xaml 在下面,我真的更愿意将所有这些都保留在 xaml 中,我可以自己想出一种方法在 codebehind/viewmodel 中完成。
<Expander x:Name="IndexExpander" IsExpanded="True" Grid.Row="4" Grid.ColumnSpan="5" Margin="10" MaxHeight="150">
<Expander.Triggers>
<EventTrigger SourceName="btnAddIndex" RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="IndexExpander" Storyboard.TargetProperty="IsExpanded" BeginTime="0:0:0.25" Duration="0:0:0.20" >
<DiscreteBooleanKeyFrame KeyTime="0" Value="True" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Expander.Triggers>
<Expander.Header>
<StackPanel DockPanel.Dock="Left" Orientation="Horizontal">
<TextBlock Text="Indexes" FontWeight="Bold"/>
<!-- Add/Delete Buttons-->
<Grid Margin="10,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="50*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" x:Name="btnAddIndex" Command="{Binding AddIndexCommand}" Template="{StaticResource AddButtonTemplate}" IsEnabled="{Binding IsEditable}" Margin="0,0,5,0" />
</Grid>
</StackPanel>
</Expander.Header>
好吧,对于任何追随我脚步的人来说,这就是我所做的。我从 here 那里得到了这个想法,并对其进行了调整,直到它正常工作。
<Expander.Triggers>
<EventTrigger SourceName="btnAddCol" RoutedEvent="Button.Click">
<BeginStoryboard x:Name="ColumnExpanderStory">
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="ColumnExpander" Storyboard.TargetProperty="IsExpanded">
<DiscreteBooleanKeyFrame KeyTime="0" Value="True" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="ToggleButton.PreviewMouseUp">
<RemoveStoryboard BeginStoryboardName="ColumnExpanderStory" />
</EventTrigger>
</Expander.Triggers>
<Expander.Header>
问题是故事板覆盖了 IsExpanded 属性 的任何其他绑定,因此必须将其删除才能恢复它们(阅读更多内容 here)。建议是使用 ToggleButton.Checked 事件删除故事板,但这对我不起作用,只有 "Preview" 事件似乎有正确的时机。我从 PreviewMouseDown 开始,但它会删除故事板,然后在鼠标向上切换扩展器时,这意味着第一次单击只会快速来回翻转状态。使用 PreviewMouseUp 解决了这个问题。
所以我有一个扩展器,我希望它具有正常的功能(用它自己的按钮打开和关闭),但我也想要一个不同的按钮在按下时展开它(这个按钮在 header扩展器)。我在 Button.Click 的事件触发器中使用情节提要,但在以这种方式展开后,普通按钮不起作用,它只是保持展开状态。我的 xaml 在下面,我真的更愿意将所有这些都保留在 xaml 中,我可以自己想出一种方法在 codebehind/viewmodel 中完成。
<Expander x:Name="IndexExpander" IsExpanded="True" Grid.Row="4" Grid.ColumnSpan="5" Margin="10" MaxHeight="150">
<Expander.Triggers>
<EventTrigger SourceName="btnAddIndex" RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="IndexExpander" Storyboard.TargetProperty="IsExpanded" BeginTime="0:0:0.25" Duration="0:0:0.20" >
<DiscreteBooleanKeyFrame KeyTime="0" Value="True" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Expander.Triggers>
<Expander.Header>
<StackPanel DockPanel.Dock="Left" Orientation="Horizontal">
<TextBlock Text="Indexes" FontWeight="Bold"/>
<!-- Add/Delete Buttons-->
<Grid Margin="10,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="50*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" x:Name="btnAddIndex" Command="{Binding AddIndexCommand}" Template="{StaticResource AddButtonTemplate}" IsEnabled="{Binding IsEditable}" Margin="0,0,5,0" />
</Grid>
</StackPanel>
</Expander.Header>
好吧,对于任何追随我脚步的人来说,这就是我所做的。我从 here 那里得到了这个想法,并对其进行了调整,直到它正常工作。
<Expander.Triggers>
<EventTrigger SourceName="btnAddCol" RoutedEvent="Button.Click">
<BeginStoryboard x:Name="ColumnExpanderStory">
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="ColumnExpander" Storyboard.TargetProperty="IsExpanded">
<DiscreteBooleanKeyFrame KeyTime="0" Value="True" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="ToggleButton.PreviewMouseUp">
<RemoveStoryboard BeginStoryboardName="ColumnExpanderStory" />
</EventTrigger>
</Expander.Triggers>
<Expander.Header>
问题是故事板覆盖了 IsExpanded 属性 的任何其他绑定,因此必须将其删除才能恢复它们(阅读更多内容 here)。建议是使用 ToggleButton.Checked 事件删除故事板,但这对我不起作用,只有 "Preview" 事件似乎有正确的时机。我从 PreviewMouseDown 开始,但它会删除故事板,然后在鼠标向上切换扩展器时,这意味着第一次单击只会快速来回翻转状态。使用 PreviewMouseUp 解决了这个问题。