Advertisement
Guest User

Untitled

a guest
Jul 28th, 2022
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.54 KB | None | 0 0
  1. public static class OutsideCloser
  2.     {
  3.         public static readonly DependencyProperty CloseProperty =
  4.             DependencyProperty.RegisterAttached(
  5.                 "Close",
  6.                 typeof(bool),
  7.                 typeof(OutsideCloser),
  8.                 new FrameworkPropertyMetadata(PropertyChangedCallback));
  9.  
  10.         [AttachedPropertyBrowsableForType(typeof(Window))]
  11.         public static void SetClose(Window target, bool value)
  12.         {
  13.             target.SetValue(CloseProperty, value);
  14.         }
  15.  
  16.         [AttachedPropertyBrowsableForType(typeof(Window))]
  17.         public static bool GetClose(Window target)
  18.         {
  19.             return (bool)target.GetValue(CloseProperty);
  20.         }
  21.  
  22.         private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  23.         {
  24.             if (d is Window window)
  25.             {
  26.                 window.Loaded += Window_Loaded;
  27.                 window.Closed += Window_Closed;
  28.                 window.LostMouseCapture += Window_LostMouseCapture;
  29.             }
  30.         }
  31.  
  32.         private static void Window_LostMouseCapture(object sender, MouseEventArgs e)
  33.         {
  34.             var window = (Window)sender!;
  35.             Mouse.Capture(window, CaptureMode.SubTree);
  36.         }
  37.  
  38.         private static void Window_Closed(object? sender, EventArgs e)
  39.         {
  40.             var window = (Window)sender!;
  41.  
  42.             window.LostMouseCapture -= Window_LostMouseCapture;
  43.             window.Closed -= Window_Closed;
  44.             window.Loaded -= Window_Loaded;
  45.  
  46.             window.RemoveHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent,
  47.                 (MouseButtonEventHandler)HandleClickOutsideOfControl);
  48.             window.ReleaseMouseCapture();
  49.         }
  50.  
  51.         private static void Window_Loaded(object sender, RoutedEventArgs e)
  52.         {
  53.             var window = (Window)sender;
  54.             Mouse.Capture(window, CaptureMode.SubTree);
  55.             window.AddHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent,
  56.                 (MouseButtonEventHandler)HandleClickOutsideOfControl);
  57.         }
  58.  
  59.         private static void HandleClickOutsideOfControl(object sender, MouseButtonEventArgs e)
  60.         {
  61.             var window = (Window)sender;
  62.             var owner = window.Owner;
  63.             var point = e.MouseDevice.GetPosition(owner);
  64.  
  65.             if (point.X >= 0 && point.X <= owner.ActualWidth && point.Y >= 0 && point.Y <= owner.ActualHeight)
  66.             {
  67.                 window.Close();
  68.             }
  69.         }
  70.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement