/// <summary> /// Dependency property event once the focused value has changed. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param> private static void FocusedValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue == (bool)e.OldValue) { return; } MdiChild mdiChild = (MdiChild)sender; bool focused = (bool)e.NewValue; if (focused) { mdiChild.RaiseEvent(new RoutedEventArgs(GotFocusEvent, mdiChild)); } else { mdiChild.RaiseEvent(new RoutedEventArgs(LostFocusEvent, mdiChild)); } }
/// <summary> /// Dependency property event once the focused value has changed. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param> private static void FocusedValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue == (bool)e.OldValue) { return; } MdiChild mdiChild = (MdiChild)sender; bool focused = (bool)e.NewValue; if (focused) { mdiChild.Dispatcher.BeginInvoke(new Func <IInputElement, IInputElement>(Keyboard.Focus), System.Windows.Threading.DispatcherPriority.ApplicationIdle, mdiChild.Content); mdiChild.RaiseEvent(new RoutedEventArgs(GotFocusEvent, mdiChild)); } else { mdiChild.RaiseEvent(new RoutedEventArgs(LostFocusEvent, mdiChild)); } }
/// <summary> /// Dependency property event once the windows state value has changed. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param> private static void WindowStateValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { MdiChild mdiChild = (MdiChild)sender; WindowState previousWindowState = (WindowState)e.OldValue; WindowState windowState = (WindowState)e.NewValue; if (mdiChild.Container == null || previousWindowState == windowState) { return; } if (previousWindowState == WindowState.Maximized) { for (int i = 0; i < mdiChild.Container.Children.Count; i++) { if (mdiChild.Container.Children[i] != mdiChild && mdiChild.Container.Children[i].WindowState == WindowState.Maximized && mdiChild.Container.Children[i].MaximizeBox) { mdiChild.Container.Children[i].WindowState = WindowState.Normal; } } ScrollViewer sv = (ScrollViewer)((Grid)mdiChild.Container.Content).Children[1]; sv.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto; sv.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; if (mdiChild.Buttons != null) { mdiChild.Buttons.Children.Clear(); } try { mdiChild.buttonsPanel.Children.Add(mdiChild.minimizeButton); mdiChild.buttonsPanel.Children.Add(mdiChild.maximizeButton); mdiChild.buttonsPanel.Children.Add(mdiChild.closeButton); } catch { } } if (previousWindowState == WindowState.Minimized) { mdiChild.minimizedPosition = mdiChild.Position; } switch (windowState) { case WindowState.Normal: { mdiChild.Position = new Point(mdiChild.originalDimension.X, mdiChild.originalDimension.Y); if (mdiChild._minimizedWidth > 0 && mdiChild._minimizedHeight > 0) { mdiChild.MinWidth = mdiChild._minimizedWidth; mdiChild.MinHeight = mdiChild._minimizedHeight; } mdiChild.Width = mdiChild.originalDimension.Width; mdiChild.Height = mdiChild.originalDimension.Height; } break; case WindowState.Minimized: { if (previousWindowState == WindowState.Normal) { mdiChild.originalDimension = new Rect(mdiChild.Position.X, mdiChild.Position.Y, mdiChild.ActualWidth, mdiChild.ActualHeight); } //double newLeft, newTop; //if (mdiChild.minimizedPosition.X >= 0 || mdiChild.minimizedPosition.Y >= 0) //{ // newLeft = mdiChild.minimizedPosition.X; // newTop = mdiChild.minimizedPosition.Y; //} //else //{ // int minimizedWindows = 0; // for (int i = 0; i < mdiChild.Container.Children.Count; i++) // if (mdiChild.Container.Children[i] != mdiChild && mdiChild.Container.Children[i].WindowState == WindowState.Minimized) // minimizedWindows++; // int capacity = Convert.ToInt32(mdiChild.Container.InnerWidth) / mdiChild.MinimizedWidth, // row = minimizedWindows / capacity + 1, // col = minimizedWindows % capacity; // newTop = mdiChild.Container.InnerHeight - mdiChild.MinimizedHeight * row; // newLeft = mdiChild.MinimizedWidth * col; //} //mdiChild.Position = new Point(newLeft, newTop); int minimizedWindows = 0; for (int i = 0; i < mdiChild.Container.Children.Count; i++) { if (mdiChild.Container.Children[i] != mdiChild && mdiChild.Container.Children[i].WindowState == WindowState.Minimized) { minimizedWindows++; } } int cols = (int)(mdiChild.Container.InnerWidth / mdiChild.MinimizedWidth); int count = 0; foreach (var item in mdiChild.Container.Children) { if (item.WindowState == WindowState.Minimized) { item.Position = new Point((int)(count % cols) * item.MinimizedWidth, mdiChild.Container.InnerHeight - ((int)((int)(count / cols) + 1)) * item.MinimizedHeight); count++; } } mdiChild._minimizedWidth = (int)mdiChild.MinWidth; mdiChild._minimizedHeight = (int)mdiChild.MinHeight; mdiChild.MinWidth = mdiChild.MinimizedWidth; mdiChild.MinHeight = mdiChild.MinimizedHeight; mdiChild.Width = mdiChild.MinimizedWidth; mdiChild.Height = mdiChild.MinimizedHeight; } break; case WindowState.Maximized: { if (previousWindowState == WindowState.Normal) { mdiChild.originalDimension = new Rect(mdiChild.Position.X, mdiChild.Position.Y, mdiChild.ActualWidth, mdiChild.ActualHeight); } try { StackPanel sp = new StackPanel { Orientation = Orientation.Horizontal }; mdiChild.Buttons = sp; if (mdiChild.Container.Theme != ThemeType.Metro) { if (mdiChild.buttonsPanel != null) { mdiChild.buttonsPanel.Children.Clear(); } sp.Children.Add(mdiChild.minimizeButton); sp.Children.Add(mdiChild.maximizeButton); sp.Children.Add(mdiChild.closeButton); } } catch { } mdiChild.Position = new Point(0, 0); if (mdiChild._minimizedWidth > 0 && mdiChild._minimizedHeight > 0) { mdiChild.MinWidth = mdiChild._minimizedWidth; mdiChild.MinHeight = mdiChild._minimizedHeight; } mdiChild.Width = mdiChild.Container.InnerWidth; mdiChild.Height = mdiChild.Container.InnerHeight; if (mdiChild.Container.AllowWindowStateMax) { MdiContainer mdiContainer = mdiChild.Container; mdiContainer.AllowWindowStateMax = false; for (int i = 0; i < mdiContainer.Children.Count; i++) { if (mdiContainer.Children[i] != mdiChild) { if (mdiContainer.Children[i].WindowState == WindowState.Normal && mdiContainer.Children[i].MaximizeBox) { mdiContainer.Children[i].WindowState = WindowState.Maximized; } else if (mdiContainer.Children[i].WindowState == WindowState.Maximized) { mdiContainer.Children[i].Height = mdiContainer.InnerHeight; } } } ScrollViewer sv = (ScrollViewer)((Grid)mdiContainer.Content).Children[1]; sv.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; sv.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden; mdiChild.Focus(); mdiContainer.InvalidateSize(); mdiContainer.AllowWindowStateMax = true; } } break; } mdiChild.RaiseEvent(new RoutedEventArgs(WindowStateChangedEvent)); }