/// <summary> /// Removes given item</summary> /// <param name="item">Item to remove</param> public void RemoveItem(DockContent item) { item.PropertyChanged -= Content_PropertyChanged; Children.Remove(item); ItemsCount = Children.Count; item.IsVisible = false; item.IsFocused = false; UpdateIconAndHeader(); }
/// <summary> /// Add new content to side tab</summary> /// <param name="content">New dock content</param> private void AddContent(DockContent content) { m_children.Add(content); content.Settings.DockState = DockState.Collapsed; FrameworkElement fe = CreateHeader(content); SideBarButton tabItem = new SideBarButton(TabsPlacement) { Content = fe, Tag = content, }; tabItem.MouseEnter += TabItem_MouseEnter; tabItem.AllowDrop = true; tabItem.DragEnter += TabItem_DragEnter; tabItem.Click += TabItem_Click; Items.Add(tabItem); content.IsVisible = true; content.IsFocused = false; content.IsFocusedChanged += DockContent_IsFocusedChanged; }
/// <summary>Add new content; the new content is single content</summary> /// <param name="toItem">Next to this item</param> /// <param name="content"></param> private void AddOneItem(DockContent toItem, DockContent content) { if (toItem != null && !Children.Contains(toItem)) { throw new ArgumentOutOfRangeException(); } int index = toItem != null ? Children.IndexOf(toItem) : Children.Count; content.PropertyChanged += Content_PropertyChanged; Children.Insert(index, content); ItemsCount = Children.Count; SelectedIndex = Items.Count - 1; content.IsVisible = true; UpdateIconAndHeader(); }
/// <summary> /// Undock given content and collapse to the side that is closest to it</summary> /// <param name="content">Content to collapse</param> internal void Collapse(IDockContent content) { Image image = null; Rect rectFrom = Rect.Empty; FrameworkElement parent = null; if (GridLayout != null && GridLayout.HasDescendant(content)) { FrameworkElement element = (FrameworkElement)content; parent = (FrameworkElement)element.Parent; if (parent != null) { rectFrom = new Rect(parent.PointToScreen(new Point(0, 0)), parent.RenderSize); // create visual image of the element that is being collapsed VisualBrush elementBrush = new VisualBrush(parent); DrawingVisual visual = new DrawingVisual(); DrawingContext dc = visual.RenderOpen(); dc.DrawRectangle(elementBrush, null, new Rect(0, 0, rectFrom.Width, rectFrom.Height)); dc.Close(); RenderTargetBitmap bitmap = new RenderTargetBitmap((int)rectFrom.Width, (int)rectFrom.Height, 96, 96, PixelFormats.Default); bitmap.Render(visual); image = new Image(); image.Source = bitmap; // undock element if (GridLayout != null) { GridLayout.Undock(content); } m_lastFocusedContent = null; } } Rect rectTo; DockContent tmp = content is TabLayout ? ((TabLayout)content).Children[0] : ((DockContent)content); ContentSettings settings = tmp.Settings; // dock to nearest side bar if (settings.Location.X > settings.Location.Y) { if (1.0 - settings.Location.X > settings.Location.Y) { PART_TopCollapsePanel.Dock(null, content, DockTo.Top); rectTo = PART_TopCollapsePanel.RectForContent(tmp); } else { PART_RightCollapsePanel.Dock(null, content, DockTo.Right); rectTo = PART_RightCollapsePanel.RectForContent(tmp); } } else { if (1.0 - settings.Location.X > settings.Location.Y) { PART_LeftCollapsePanel.Dock(null, content, DockTo.Left); rectTo = PART_LeftCollapsePanel.RectForContent(tmp); } else { PART_BottomCollapsePanel.Dock(null, content, DockTo.Bottom); rectTo = PART_BottomCollapsePanel.RectForContent(tmp); } } // animate! if (parent != null) { AnimateCollapse(image, rectFrom, rectTo); } }
/// <summary> /// Show or expand popup</summary> /// <param name="dockContent">Dock content</param> internal void ShowPopup(DockContent dockContent) { if (PART_Popup.IsOpen) { if (!((DockedWindow)PART_Popup.Content).HasChild(dockContent)) { ClosePopup(); } else { return; } } ContentSettings settings = dockContent.Settings; switch (Orientation) { case Orientation.Horizontal: PART_Popup.MaxWidth = RenderSize.Width; PART_Popup.MaxHeight = 0.75 * Math.Min(Root.RenderSize.Height, System.Windows.SystemParameters.PrimaryScreenHeight); PART_Popup.Width = RenderSize.Width; PART_Popup.Height = Math.Min(settings.Size.Height + 25, PART_Popup.MaxHeight); break; case Orientation.Vertical: PART_Popup.MaxWidth = 0.75 * Math.Min(Root.RenderSize.Width, System.Windows.SystemParameters.PrimaryScreenWidth); PART_Popup.MaxHeight = RenderSize.Height; PART_Popup.Width = Math.Min(settings.Size.Width + 7, PART_Popup.MaxWidth); PART_Popup.Height = RenderSize.Height; break; } DockedWindow window = new DockedWindow(Root, dockContent); window.Closing += Window_Closing; window.Focused = true; window.IsCollapsed = true; PART_Popup.Content = window; PART_Popup.Tag = dockContent; BooleanAnimationUsingKeyFrames booleanAnimation = new BooleanAnimationUsingKeyFrames(); booleanAnimation.Duration = TimeSpan.FromSeconds(0.1); booleanAnimation.KeyFrames.Add( new DiscreteBooleanKeyFrame( false, // Target value (KeyValue) KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.0))) // KeyTime ); booleanAnimation.KeyFrames.Add( new DiscreteBooleanKeyFrame( true, // Target value (KeyValue) KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.1))) // KeyTime ); PART_Popup.IsOpen = true; Root.Focus(dockContent); m_timer.Start(); }
/// <summary> /// Unregister dock content</summary> /// <param name="ucid">Unique name for content</param> public void UnregisterContent(String ucid) { if (!m_registeredContents.ContainsKey(ucid)) { throw new ArgumentOutOfRangeException("Specified content name is not registered"); } HideContent(ucid); m_registeredContents[ucid].IsFocusedChanged -= DockContent_IsFocusedChanged; if (m_lastFocusedContent == m_registeredContents[ucid]) { m_lastFocusedContent = null; } RegisteredContents.Remove(m_registeredContents[ucid]); m_registeredContents.Remove(ucid); }
void DockContent_IsFocusedChanged(object sender, BooleanArgs e) { if (e.Value == true) { if (m_lastFocusedContent != sender) { if (m_lastFocusedContent != null && m_lastFocusedContent.IsFocused) { m_lastFocusedContent.IsFocused = false; } m_lastFocusedContent = (DockContent)sender; } } else { if (m_lastFocusedContent == sender) { m_lastFocusedContent = null; this.Focus(); } } }
/// <summary> /// Register content with docking panel</summary> /// <param name="content">Content to register</param> /// <param name="ucid">Unique name for content (identifier, won't be visible anywhere in UI)</param> /// <param name="dockSide">Default docking place (center, left, right, top, bottom)</param> /// <param name="header">Header information to display in the docked tab or title bar</param> /// <param name="icon">Icon to display</param> /// <returns>New dock content</returns> public IDockContent RegisterContent(object content, String ucid, DockTo dockSide, String header, ImageSource icon) //where T : FrameworkElement, IDockContent { if (m_registeredContents.ContainsKey(ucid)) { throw new ArgumentException("Content with given id already exists, id/name must be unique"); } DockContent dockContent = new DockContent(content, ucid, header, icon) { Settings = new ContentSettings(dockSide) }; dockContent.IsFocusedChanged += DockContent_IsFocusedChanged; m_registeredContents.Add(ucid, dockContent); RegisteredContents.Add(dockContent); return dockContent; }
/// <summary> /// Show or expand popup</summary> private void ShowPopup() { DockContent dockContent = (DockContent)m_lastItemOver.Tag; ShowPopup(dockContent); }
/// <summary> /// Add new content to this side tab /// </summary> /// <param name="content"></param> private void AddContent(DockContent content) { m_children.Add(content); content.Settings.DockState = DockState.Collapsed; FrameworkElement fe = CreateHeader(content); SideBarButton tabItem = new SideBarButton(TabsPlacement) { Content = fe, Tag = content, }; tabItem.MouseEnter += new System.Windows.Input.MouseEventHandler(TabItem_MouseEnter); tabItem.AllowDrop = true; tabItem.DragEnter += new DragEventHandler(TabItem_DragEnter); tabItem.Click += new RoutedEventHandler(TabItem_Click); Items.Add(tabItem); content.IsVisible = true; content.IsFocused = false; content.IsFocusedChanged += new EventHandler<BooleanArgs>(DockContent_IsFocusedChanged); }