我在WPF中有一个基于MVVM格式的用户控件。 usercontrol是排列在面板中的视图模型的集合。面板的数量(或相关视图/视图模型)将在运行时决定。
每个面板都是用户控件,并引用视图模型(案例为工作空间)。每个面板由一个按钮和一个列表框组成。最初加载时,只显示所有面板的按钮。单击按钮,将显示相应的列表框。直到这样它才能正常工作。
我需要的是,如果用户点击任何其他区域,那么当前崩溃的列表框应该崩溃。如果用户选择另一个按钮,则应显示该列表框,并且应折叠当前打开的列表框。
目前它显示在按钮点击但永不关闭
为了显示列表框,我在按钮触发器中使用以下代码:
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.Target="{x:Reference ListBoxDrop}"
Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}">
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
有什么建议吗?
答案 0 :(得分:1)
只需添加另一个触发器!
<Button Content="Button" Height="23" Name="button" Width="75" >
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.Target="{x:Reference ListBoxDrop}"
Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Visible}"></DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.LostFocus">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.Target="{x:Reference ListBoxDrop}"
Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="{x:Static Visibility.Collapsed}"></DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
答案 1 :(得分:0)
然而,用户的预期行为是让列表框专注于按钮点击。
因此,即使用户选择了相应的列表框(或其项目),该按钮也将失去焦点。因此,再次隐藏列表框。
我建议像这样修改它:
<ListBox.Triggers>
<EventTrigger RoutedEvent="GotFocus">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="myListBox" Storyboard.TargetProperty="Opacity" Duration="0:0:0.1" To="1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="LostFocus">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="myListBox" Storyboard.TargetProperty="Opacity" Duration="0:0:0.1" To="0"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</ListBox.Triggers>
对于相应的按钮,在codebehind ...
中设置一个事件处理程序private void Btn_Click(object sender, RoutedEventArgs e)
{
myListBox.Focus();
}