2012-05-31 24 views
9

Quiero cerrar un System.Windows.Window si el usuario hace clic fuera de él. La ventana se muestra como un cuadro de diálogo. ¿Cómo recibo los clics fuera de una ventana de wpf?cómo cerrar una ventana de diálogo de WPF cuando el usuario hace clic fuera de ella

AppointmentDetailsView.ShowDialog(); 
+2

no me gustaría que este comportamiento como usuario;) – blindmeis

+2

@blindmeis es obvio que no han llegado a través de un caso de uso. comprobar metrotwit. – frostymarvelous

Respuesta

2

Tras una exploración más profunda, he encontrado una solución que funciona bien. Esperemos que alguien lo encuentre útil:

RadWindow PopupWindow; 
public SampleView() 
{ 
    InitializeComponent(); 
    PopupWindow = new RadWindow { Header = "Details", Name = "radWindow" }; 
    PopupWindow.Loaded += new RoutedEventHandler(PopupWindow_Loaded); 
} 
void PopupWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    Canvas canvas = Framework.Traversal.FirstVisualAncestorOfType<Canvas>(PopupWindow); 
    canvas.MouseLeftButtonDown -= canvas_MouseLeftButtonDown; 
    canvas.MouseLeftButtonDown += canvas_MouseLeftButtonDown; 
} 
void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    Point mousepoint = e.GetPosition(null); 
    var elements = VisualTreeHelper.FindElementsInHostCoordinates(mousepoint, PopupWindow); 
    if (elements.Count() == 0) 
     PopupWindow.Close(); 
} 
+0

Esto podría funcionar, pero la solución sugerida en la respuesta a continuación de @ sky-dev es mucho más simple y funciona bien. – sprite

12

¿Qué tal esto?

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnDeactivated(EventArgs e) 
    { 
     base.OnDeactivated(e); 
     Close(); 
    } 
} 
+2

Esta es una solución mucho más simple y funciona. También podría agregar un controlador de eventos al evento Desactivado en XAML o en el código: 'Desactivado = "Desactivado de ventana' ' o' Desactivado + = Desactivado de ventana ';/* en código */respectivamente. Luego simplemente llame a close(); en el controlador. – sprite

Cuestiones relacionadas