Beispiel #1
0
        internal static void SetupFocusManagement(DockingManager manager)
        {
            if (_managers.Count == 0)
            {
                //InputManager.Current.EnterMenuMode += new EventHandler(InputManager_EnterMenuMode);
                //InputManager.Current.LeaveMenuMode += new EventHandler(InputManager_LeaveMenuMode);
                _windowHandler = new WindowHookHandler();
                _windowHandler.FocusChanged += new EventHandler <FocusChangeEventArgs>(WindowFocusChanging);
                //_windowHandler.Activate += new EventHandler<WindowActivateEventArgs>(WindowActivating);
                _windowHandler.Attach();

                if (Application.Current != null)
                {
                    var currentDispatcher = Application.Current.Dispatcher;
                    if (currentDispatcher != null)
                    {
                        if (currentDispatcher.CheckAccess())
                        {
                            Application.Current.Exit += new ExitEventHandler(Current_Exit);
                        }
                        else
                        {
                            var disableProcessingCountFieldInfo = typeof(Dispatcher).GetField("_disableProcessingCount", BindingFlags.Instance | BindingFlags.NonPublic);
                            if (disableProcessingCountFieldInfo != null)
                            {
                                var disableProcessingCountFieldInfoValue = disableProcessingCountFieldInfo.GetValue(currentDispatcher);
                                if ((disableProcessingCountFieldInfoValue != null) && (disableProcessingCountFieldInfoValue is int))
                                {
                                    var action = new Action(() => Application.Current.Exit += new ExitEventHandler(Current_Exit));

                                    if (( int )disableProcessingCountFieldInfoValue == 0)
                                    {
                                        // in sync
                                        currentDispatcher.Invoke(DispatcherPriority.Normal, action);
                                    }
                                    else
                                    {
                                        // in async.
                                        currentDispatcher.BeginInvoke(DispatcherPriority.Normal, action);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            manager.PreviewGotKeyboardFocus += new KeyboardFocusChangedEventHandler(manager_PreviewGotKeyboardFocus);
            _managers.Add(manager);
        }
        internal static void SetupFocusManagement(DockingManager manager)
        {
            if (_managers.Count == 0)
            {
                //InputManager.Current.EnterMenuMode += new EventHandler(InputManager_EnterMenuMode);
                //InputManager.Current.LeaveMenuMode += new EventHandler(InputManager_LeaveMenuMode);
                _windowHandler = new WindowHookHandler();
                _windowHandler.FocusChanged += new EventHandler<FocusChangeEventArgs>(WindowFocusChanging);
                //_windowHandler.Activate += new EventHandler<WindowActivateEventArgs>(WindowActivating);
                _windowHandler.Attach();

                if (Application.Current != null)
                    Application.Current.Exit += new ExitEventHandler(Current_Exit);
            }

            manager.PreviewGotKeyboardFocus += new KeyboardFocusChangedEventHandler(manager_PreviewGotKeyboardFocus);
            _managers.Add(manager);
        }
        internal static void SetupFocusManagement(DockingManager manager)
        {
            if (_managers.Count == 0)
            {
                //InputManager.Current.EnterMenuMode += new EventHandler(InputManager_EnterMenuMode);
                //InputManager.Current.LeaveMenuMode += new EventHandler(InputManager_LeaveMenuMode);
                _windowHandler = new WindowHookHandler();
                _windowHandler.FocusChanged += new EventHandler <FocusChangeEventArgs>(WindowFocusChanging);
                //_windowHandler.Activate += new EventHandler<WindowActivateEventArgs>(WindowActivating);
                _windowHandler.Attach();

                if (Application.Current != null)
                {
                    Application.Current.Exit += new ExitEventHandler(Current_Exit);
                }
            }

            manager.PreviewGotKeyboardFocus += new KeyboardFocusChangedEventHandler(manager_PreviewGotKeyboardFocus);
            _managers.Add(manager);
        }
        internal static void SetupFocusManagement(DockingManager manager)
        {
            if (_managers.Count == 0)
            {
                //InputManager.Current.EnterMenuMode += new EventHandler(InputManager_EnterMenuMode);
                //InputManager.Current.LeaveMenuMode += new EventHandler(InputManager_LeaveMenuMode);
                _windowHandler = new WindowHookHandler();
                _windowHandler.FocusChanged += new EventHandler <FocusChangeEventArgs>(WindowFocusChanging);
                //_windowHandler.Activate += new EventHandler<WindowActivateEventArgs>(WindowActivating);
                _windowHandler.Attach();
                if (Application.Current != null)
                {
                    //Application.Current.Exit += new ExitEventHandler( Current_Exit );
                    //Application.Current.Dispatcher.Invoke(new Action(() => Application.Current.Exit += new ExitEventHandler(Current_Exit)));
                    var    disp = Application.Current.Dispatcher;
                    Action subscribeToExitAction = new Action(() => Application.Current.Exit += new ExitEventHandler(Current_Exit));
                    if (disp.CheckAccess())
                    {
                        // if we are already on the dispatcher thread we don't need to call Invoke/BeginInvoke
                        subscribeToExitAction();
                    }
                    else
                    {
                        // For resolve issue "System.InvalidOperationException: Cannot perform this operation while dispatcher processing is suspended." make async subscribing instead of sync subscribing.
                        int disableProcessingCount = (int?)typeof(Dispatcher).GetField("_disableProcessingCount", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(disp) ?? 0;

                        if (disableProcessingCount == 0)
                        {
                            disp.Invoke(subscribeToExitAction);
                        }
                        else
                        {
                            disp.BeginInvoke(subscribeToExitAction);
                        }
                    }
                }
            }

            manager.PreviewGotKeyboardFocus += new KeyboardFocusChangedEventHandler(manager_PreviewGotKeyboardFocus);
            _managers.Add(manager);
        }