【问题标题】:Detect mouse left button down (Click) outside a border WPF MVVM检测边框外的鼠标左键按下(单击) WPF MVVM
【发布时间】:2017-07-25 15:28:55
【问题描述】:

我在 MVVM 中有一个边框。我想要实现的是在边框外检测鼠标左键,然后将其隐藏。我可以在主窗口的 MouseLeftButtonDown 事件中执行此操作,但我不知道这是否是最佳解决方案。我怎么能这样做?我想避免这个点击干扰其他事件,例如这个边框被放置在一个stackpanel中,并且stackpanel在鼠标左键双击时被隐藏。

<Border Grid.Row="2" 
     x:Name="customPopup" 
     CornerRadius="10,10,0,0" 
     Height="25" Margin="0"
     HorizontalAlignment="Center" 
     VerticalAlignment="Center"
     Width="Auto"
     BorderBrush="DarkBlue" 
     BorderThickness="1"  
     Background="AntiqueWhite">
    <StackPanel  Orientation="Horizontal" 
                 HorizontalAlignment="Center">
        <Image Source="/Common.Images;component/Images/Info.png" 
               Height="20" 
               Width="20" Stretch="Fill"/>
        <TextBlock Margin="5" 
                   VerticalAlignment="Center" 
                   HorizontalAlignment="Left" 
                   Background="Transparent" 
                   FontSize="12">
                  <Run Text="Click outside to close it"/>
        </TextBlock>
    </StackPanel>
</Border>

【问题讨论】:

    标签: wpf xaml mvvm mouseleftbuttondown


    【解决方案1】:

    在窗口上使用MouseDown 可能是获得所需结果的最佳选择。您需要进行一些计算才能查看光标是否在边界之外。比如:

    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        // get positions
        Point mouseLoc = Mouse.GetPosition(null);
        Point borderLoc = customPopup.TranslatePoint(new Point(0,0), null);
    
        // check if the mouse is outside the border
        if((mouseLoc.X < borderLoc.x || mouseLoc.X > (borderLoc.X + customPopup.ActualWidth)) && (mouseLoc.Y < borderLoc.Y || mouseLoc.Y > borderloc.Y + customPopup.ActualHeight))
        {
            // hide the border
        }
    }
    

    然后处理双击,使用PreviewMouseDoubleClick。由于预览事件是隧道而不是冒泡,因此即使您在同一元素上有单击事件,也应该调用双击。

    private void Window_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
         // double click code...
         e.Handled = true;
    }
    

    【讨论】:

    • 我没有看到任何带有您发布的签名的方法。有以下签名: private void Window_PreviewMouseDown(object sender, MouseButtonEventArgs e) 它也不起作用,因为我的双击事件(隐藏堆栈面板)当时不起作用。
    • 把我的隧道/冒泡事件弄混了,检查我的编辑
    • 在 Window_MouseDown 中,使用 && 应该是 ||。此外,当单击外部自定义弹出窗口时,它并不总是被隐藏,例如,如果我点击一个按钮或一个文本框,那么弹出窗口不会被隐藏。单击弹出窗口外的 UI 中的任何控件时,我希望隐藏。我该如何解决这个问题?
    • 为了计算光标是否在边框之外,您需要 && 因为您需要确保 X 和 Y 值都在边框之外,而不仅仅是一个或另一个。至于未触发的事件,按钮或文本框的单击事件可能正在其他地方处理。查看这篇关于隧道与冒泡事件的帖子,因为这就是您的问题stackoverflow.com/questions/16736444/…
    猜你喜欢
    • 2011-04-26
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多