自动关闭扩展器

时间:2012-05-24 13:22:30

标签: wpf wpf-controls

我使用了一个扩展器控件来创建某种滑出式面板,它包含一些过滤选项。用户可以选择将此扩展器“固定”到视图中。一切顺利,但现在我想知道当用户点击扩展器的某个地方时,如何让扩展器自动关闭。我尝试了LostFocus和其他一些事件,但无济于事。当用户点击其他地方时,哪个事件可以通知我?

(目前我只是使用一个定时器,在鼠标离开扩展器后+ - 2秒后关闭扩展器,但我更喜欢其他解决方案)

提前致谢。

2 个答案:

答案 0 :(得分:9)

假设您的Expander被命名为“yourExpander”,您可以这样做:

<Window PreviewMouseDown="Window_PreviewMouseDown"

如果e.OriginalSource不是扩展器的后代,请关闭扩展器:

private void Window_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    Visual visual = e.OriginalSource as Visual;

    if (!visual.IsDescendantOf(yourExpander))
        yourExpander.IsExpanded = false;
}

答案 1 :(得分:0)

为了让我的用户在鼠标悬停在扩展器的任何部分上时自动展开该扩展器,并在不将其关闭时将其关闭,我使用了以下代码;

在viewModel中添加一个MenuIsVisible属性,一个closeMenu方法,一个openMenu方法和2个ICommands; CloseExpanderCommand和OpenExpanderCommand

public class TripsViewModel : ViewModelBase
{

    private bool _menuIsVisible;
    public bool MenuIsVisible
    {
        get=>_menuIsVisible;
        set
        {
            if (value == _menuIsVisible) { return;}
            _menuIsVisible = value;
            RaisePropertyChanged();
        }
    }

    private void CloseExpander() { MenuIsVisible = false;}
    private void OpenExpander() { MenuIsVisible = true;}

    public ICommand CloseExpanderCommand { get; }
    public ICommand OpenExpanderCommand { get; }

您认为: 确保您参考:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

然后

<Border >
   <i:Interaction.Triggers>
       <i:EventTrigger EventName="MouseEnter">
           <i:InvokeCommandAction Command="{Binding OpenExpanderCommand}" />
       </i:EventTrigger>
         <i:EventTrigger EventName="MouseLeave">
            <i:InvokeCommandAction Command="{Binding CloseExpanderCommand}" />
         </i:EventTrigger>
       </i:Interaction.Triggers>
       <Expander Tag="Menu"
              ExpandDirection="Right"
              Header="Menu"
              IsExpanded="{Binding MenuIsVisible}">
            <StackPanel>
            </StackPanel>
       </Expander>
    </Border>

事件触发器是发生魔术的地方。