// Token: 0x06005E7F RID: 24191 RVA: 0x001A7C44 File Offset: 0x001A5E44 private static void OnLostMouseCapture(object sender, MouseEventArgs e) { MenuBase menuBase = sender as MenuBase; if (Mouse.Captured != menuBase) { if (e.OriginalSource == menuBase) { if (Mouse.Captured == null || !MenuBase.IsDescendant(menuBase, Mouse.Captured as DependencyObject)) { menuBase.IsMenuMode = false; return; } } else if (MenuBase.IsDescendant(menuBase, e.OriginalSource as DependencyObject)) { if (menuBase.IsMenuMode && Mouse.Captured == null && SafeNativeMethods.GetCapture() == IntPtr.Zero) { Mouse.Capture(menuBase, CaptureMode.SubTree); e.Handled = true; return; } } else { menuBase.IsMenuMode = false; } } }
//------------------------------------------------------------------- // // Private Methods // //------------------------------------------------------------------- #region Private Methods /// <summary> /// Called when this element loses capture. /// </summary> private static void OnLostMouseCapture(object sender, MouseEventArgs e) { MenuBase menu = sender as MenuBase; // need a better solution for subcapture! // Use the same technique employed in ComoboBox.OnLostMouseCapture to allow another control in the // application to temporarily take capture and then take it back afterwards. if (Mouse.Captured != menu) { if (e.OriginalSource == menu) { // If capture is null or it's not below the menu, close. // More workaround for task 22022 -- check if it's a descendant (following Logical links too) if (Mouse.Captured == null || !MenuBase.IsDescendant(menu, Mouse.Captured as DependencyObject)) { menu.IsMenuMode = false; } } else { if (MenuBase.IsDescendant(menu, e.OriginalSource as DependencyObject)) { // Take capture if one of our children gave up capture if (menu.IsMenuMode && Mouse.Captured == null && MS.Win32.SafeNativeMethods.GetCapture() == IntPtr.Zero) { Mouse.Capture(menu, CaptureMode.SubTree); e.Handled = true; } } else { menu.IsMenuMode = false; } } } }
// Token: 0x06005E7A RID: 24186 RVA: 0x001A7A75 File Offset: 0x001A5C75 private bool IsDescendant(DependencyObject node) { return(MenuBase.IsDescendant(this, node)); }