【发布时间】:2015-04-27 15:52:11
【问题描述】:
背景
我有一个HeaderedContentControl 的控件模板,其中包含一个按钮作为标题,单击时会打开一个包含主要内容的弹出窗口(通过EventTrigger)。
这按我的预期工作,直到我尝试向折叠控件的弹出窗口添加一个按钮。主按钮(标题)消失了,但弹出窗口(内容)保持在原来的位置,直到我从它那里获得鼠标焦点(通过单击某处)。
这里有一个简短的例子来演示这个问题:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="WpfTest.View"
Height="300" Width="400" >
<Window.Resources>
<ControlTemplate x:Key="ControlTemplate" TargetType="{x:Type HeaderedContentControl}" >
<Grid Width="100" Height="25" >
<Button Content="{TemplateBinding Header}" >
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click" >
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="Popup"
Storyboard.TargetProperty="(Popup.IsOpen)" >
<DiscreteBooleanKeyFrame KeyTime="0" Value="True" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<Popup x:Name="Popup" StaysOpen="False" >
<ContentPresenter Content="{TemplateBinding Content}" />
</Popup>
</Grid>
</ControlTemplate>
</Window.Resources>
<HeaderedContentControl x:Name="MainControl" Template="{StaticResource ControlTemplate}" Header="Show Popup" >
<HeaderedContentControl.Content>
<Border Background="White" BorderThickness="1" BorderBrush="Black" >
<Button Margin="2" Content="Hide All" >
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click" >
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="MainControl"
Storyboard.TargetProperty="(UIElement.Visibility)" >
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</Border>
</HeaderedContentControl.Content>
</HeaderedContentControl>
</Window>
在我的真实代码中,ControlTemplate 与控件的用法不在同一个地方。它完全在其他地方的 ResourceDictionary 中,并且不应该对其弹出窗口的内容一无所知 - 它直接将其传递给 ContentPresenter。
问题
有没有办法让ControlTemplate 在折叠HeaderedContentControl 时使弹出窗口消失,最好不要让ControlTemplate 知道包含“隐藏”按钮的弹出窗口的可能性?
我尝试过的
- 向
HeaderedContentControl添加另一个触发器以观察IsVisible的变化。 没有合适的EventTrigger并且其他触发器不能包含元素名称。 - 在
HeaderedContentControl的子类中向IsVisibleChanged添加事件处理程序。 事件触发,但Popup.IsOpen在设置为false后仍为true。
【问题讨论】:
-
它可能不符合您的要求,但我认为我更喜欢 John Melville 的方法:stackoverflow.com/questions/361209/…。没有故事板,更简单的绑定。