如何在单击控件外部时更改可见性

时间:2011-09-27 03:08:04

标签: wpf xaml

我在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>

有什么建议吗?

  • 吉里贾

2 个答案:

答案 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();
        }