/// <summary>
        /// Добавление нового окна
        /// </summary>
        /// <param name="opened">экземпляр нового окна</param>
        /// <param name="info">дополнительная информация об окне</param>
        public void OpenWindow(WindowExemplar opened, string info = "", bool saveToConfig = true)
        {
            WindowExemplar we = OpenedWins.Where(p => p.Title == opened.Title).FirstOrDefault();

            if (we != null)
            {
                if (we.AllowDuplicate == false)
                {
                    if (we.Visibility == Visibility.Collapsed)
                    {
                        we.Visibility = Visibility.Visible;
                        return;
                    }
                    else
                    {
                        return;
                    }
                }
            }
            //подключаем обработчики событий изменения окна
            opened.Moved      += new EventHandler(MoveWindow);
            opened.Resized    += new EventHandler(ResizeWindow);
            opened.Minimized  += new EventHandler(MinimizeWindow);
            opened.Maximized  += new EventHandler(MaximizeWindow);
            opened.Closed     += new EventHandler(CloseWindow);
            opened.MouseEnter += new EventHandler(MouseEnterWindow);
            opened.MouseLeave += new EventHandler(MouseLeaveWindow);
            opened.Clicked    += new EventHandler(opened_Clicked);

            //добавление в драйвер и коллекцию менеджера
            AddWindow(opened, -1, -1, saveToConfig, info);
        }
        /// <summary>
        /// Обработчик события сворачивания окна
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void MinimizeWindow(object sender, EventArgs args)
        {
            WindowExemplar     window = sender as WindowExemplar;
            RenderTargetBitmap rtb    = new RenderTargetBitmap(
                (int)window.WindowWidth,
                (int)window.WindowHeight,
                96,
                96,
                PixelFormats.Pbgra32);

            rtb.Render(window.LayoutRoot);
            Grid g = new Grid();

            g.Tag = window;
            g.MouseLeftButtonUp += g_MouseLeftButtonUp;
            g.Width              = g.Height = 100;
            Border b = new Border();

            b.Background = new SolidColorBrush(Colors.Black);
            b.Opacity    = 0.3;
            g.Children.Add(b);
            Image img = new Image {
                Source = rtb, Width = 100, Height = 100, Stretch = System.Windows.Media.Stretch.UniformToFill
            };

            g.Children.Add(img);
            stkOpened.Children.Add(g);
            window.Visibility = Visibility.Collapsed;
            AddWindowToMinList(window);
            MaximazeMinimazeWin(window, true);
        }
 private void PlaceWinToTop(WindowExemplar win)
 {
     foreach (var item in LayoutRoot.Children)
     {
         Canvas.SetZIndex((UIElement)item, 0);
     }
     Canvas.SetZIndex(win, 1);
 }
        void g_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Grid           g      = (Grid)sender;
            WindowExemplar window = (WindowExemplar)g.Tag;

            window.Visibility = Visibility.Visible;
            stkOpened.Children.Remove(g);
        }
        /// <summary>
        /// Обработчик события перемещения окна
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void MoveWindow(object sender, EventArgs args)
        {
            WindowExemplar window = sender as WindowExemplar;

            PlaceWinToTop(window);
            OpenedWins[OpenedWins.IndexOf(window)] = window;
            SaveWindowsSettings();
        }
        /// <summary>
        /// Обработчик события закрытия окна
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void CloseWindow(object sender, EventArgs args)
        {
            WindowExemplar window = sender as WindowExemplar;

            OpenedWins.Remove(window);
            LayoutRoot.Children.Remove(window);
            if (CloseWindows != null)
            {
                CloseWindows(window, new EventArgs());
            }
            SaveWindowsSettings();
        }
        /// <summary>
        /// Обработчик события разворачивания окна на весь экран
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void MaximizeWindow(object sender, EventArgs args)
        {
            WindowExemplar window = sender as WindowExemplar;

            window.grdContent.Height = LayoutRoot.ActualHeight - 30;
            window.grdContent.Width  = LayoutRoot.ActualWidth - 5;
            window.SetValue(Canvas.LeftProperty, (double)2);
            window.SetValue(Canvas.TopProperty, (double)2);

            //вызываем события перемещения и растяжения
            MoveWindow(sender, args);
            ResizeWindow(sender, args);
            MaximazeMinimazeWin(window, false);
        }
        /// <summary>
        /// Добавление в драйвер и коллекцию окон менеджера
        /// </summary>
        /// <param name="window">Экземпляр нового окна</param>
        private void AddWindow(WindowExemplar window, double left, double top, bool saveSettings, string info = "")
        {
            window.Index     = window.Index;
            window.SM.LinkId = info;
            OpenedWins.Add(window);
            LayoutRoot.Children.Add(window);
            if (left < 0 || top < 0)
            {
                Canvas.SetLeft(window, this._tempLeft);
                Canvas.SetTop(window, this._tempTop);

                this._tempLeft += HORIZONTAL_STEP;
                this._tempTop  += VERTICAL_STEP;

                window.CurrentPosition = new Point(this._tempLeft, this._tempTop);

                if (this._tempLeft > this.Width - 400)
                {
                    this._tempLeft = 0;
                }
                if (this._tempTop > this.Height - 300)
                {
                    this._tempTop = 0;
                }
            }
            else
            {
                Canvas.SetLeft(window, left);
                Canvas.SetTop(window, top);
                window.CurrentPosition = new Point(left, top);
            }
            Canvas.SetZIndex(window, this.currentZIndex);
            this.currentZIndex++;
            if (saveSettings)
            {
                SaveWindowsSettings();
            }
        }
 private void MaximazeMinimazeWin(WindowExemplar window, bool maximazed)
 {
     OpenedWins[OpenedWins.IndexOf(window)].SM.Minimized = !maximazed;
     OpenedWins[OpenedWins.IndexOf(window)].SM.Maximize  = maximazed;
     SaveWindowsSettings();
 }
 private void AddWindowToMinList(WindowExemplar win)
 {
     minimizedImagesList.Add(win.Title);
 }