2017-07-25 2 views
0

Ich habe eine Grenze in MVVM. Was ich versuche zu erreichen, ist die linke Maustaste außerhalb des Rahmens zu erkennen und dann zu verstecken. Ich kann es innerhalb des MouseLeftButtonDown Ereignisses für das Hauptfenster tun, aber ich weiß nicht, ob es die beste Lösung ist. Wie könnte ich das tun? Ich möchte vermeiden, dass dieser Klick andere Ereignisse beeinflusst, zum Beispiel wird dieser Rahmen in einem Stackpanel platziert und das Stackpanel wird durch Klicken auf die linke Maustaste der Maus ausgeblendet.Detect Maus links unten (Klick) außerhalb einer Grenze WPF MVVM

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

Antwort

0

Mit MouseDown auf dem Fenster ist wahrscheinlich die beste Wahl Ihre gewünschten Ergebnisse zu erzielen. Sie müssen einige Berechnungen durchführen, um zu sehen, ob sich der Cursor außerhalb des Rahmens befindet. Etwas wie:

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 
    } 
} 

Dann den Doppelklick zu handhaben, verwenden PreviewMouseDoubleClick. Da Vorschau-Ereignisse tunnelnd und nicht sprudelnd sind, sollte der Doppelklick auch dann aufgerufen werden, wenn Sie ein einzelnes Klick-Ereignis für dasselbe Element haben.

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

Ich habe keine Methode mit der von Ihnen geposteten Signatur gesehen. Es gibt folgende Signatur: private void Window_PreviewMouseDown (Objekt Absender, MouseButtonEventArgs e) Auch es funktioniert nicht, da mein Doppelklick-Ereignis (das das Stackpanel verbirgt) nicht funktioniert. – user1624552

+0

Haben meine Tunneling/Bubbling-Ereignisse durcheinander gebracht, überprüfen Sie meine Bearbeitung –

+0

Innerhalb von Window_MouseDown verwenden Sie && und es sollte || sein. Auch wenn Sie außerhalb eines benutzerdefinierten Popup-Fensters klicken, wird es nicht immer ausgeblendet. Wenn ich zum Beispiel auf eine Schaltfläche oder in ein Textfeld klicke, wird das Popup nicht ausgeblendet. Ich möchte ausgeblendet werden, wenn ich auf ein Steuerelement in der Benutzeroberfläche außerhalb des Popup-Fensters klicke. Wie kann ich das lösen? – user1624552