private static void TabControl_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { TabControl sourceTabControl = (TabControl)sender; sourceTabControl.PreviewMouseLeftButtonUp -= TabTearOffBehavior.TabControl_PreviewMouseLeftButtonUp; sourceTabControl.PreviewMouseMove -= TabTearOffBehavior.TabControl_PreviewMouseMove; sourceTabControl.MouseLeave -= TabTearOffBehavior.TabControl_MouseLeaveOrLostCapture; sourceTabControl.LostMouseCapture -= TabTearOffBehavior.TabControl_MouseLeaveOrLostCapture; if (sourceTabControl.IsMouseCaptured) { TabItem tabItem = TabTearOffBehavior._activeTabItem; Point dragWindowLocation = new Point { X = TabTearOffBehavior._dragWindow.Left, Y = TabTearOffBehavior._dragWindow.Top }; sourceTabControl.ReleaseMouseCapture(); if (TabTearOffBehavior._adorner != null) { TabTearOffBehavior._adorner.Detach(); TabTearOffBehavior._adorner = null; } TabTearOffBehavior._dragWindow.Close(); TabTearOffBehavior._dragWindow = null; TabTearOffBehavior._activeTabItem = null; object item = sourceTabControl.ItemContainerGenerator.ItemFromContainer(tabItem); int sourceIndex = sourceTabControl.ItemContainerGenerator.IndexFromContainer(tabItem); Window dropWindow = TabTearOffBehavior.GetWindowMouseIsOver(e); TabControl targetTabControl; Panel targetPanel; ITabTearOffHandler targetHandler; if (dropWindow != null && TabTearOffBehavior.IsMouseInDropLocation(e, targetTabControl = TabTearOffBehavior.FindTargetTabControl(dropWindow, out targetHandler), targetPanel = ControlMethods.GetPanel(targetTabControl))) { int insertionIndex = TabTearOffBehavior.DetermineInsertionIndex(targetTabControl, e, targetPanel.GetOrientation()); if (!object.ReferenceEquals(sourceTabControl, targetTabControl)) { if (targetHandler.AllowTargetedDrop(item, sourceTabControl, sourceIndex, targetTabControl, insertionIndex)) { targetHandler.HandleTargetedDrop(item, sourceTabControl, sourceIndex, targetTabControl, insertionIndex); } } else if (sourceTabControl.Items.Count != 1 && insertionIndex != sourceIndex && targetHandler.AllowReorder(item, sourceTabControl, sourceIndex, insertionIndex)) { targetHandler.HandleReorder(item, sourceTabControl, sourceIndex, insertionIndex); } } else { ITabTearOffHandler sourceHandler = TabTearOffBehavior.GetHandler(sourceTabControl); if (sourceHandler.AllowTargetlessDrop(item, sourceTabControl, sourceIndex, dragWindowLocation)) { sourceHandler.HandleTargetlessDrop(item, sourceTabControl, sourceIndex, dragWindowLocation); } } } e.Handled = true; }
private void RemoveInsertionAdorner() { if (this.insertionAdorner != null) { this.insertionAdorner.Detach(); this.insertionAdorner = null; } }
private void RemoveInsertionAdorner() { if (_insertionAdorner != null) { _insertionAdorner.Detach(); _insertionAdorner = null; } }
private void DestroyInsertionAdorner() { if (_insertionAdorner != null) { _insertionAdorner.Dispose(); _insertionAdorner = null; } }
private void RemoveAdorner() { if (insertionAdorner != null) { insertionAdorner.Detach(); insertionAdorner = null; } }
private void CreateInsertionAdorner() { if (this.targetItem != null) { // Here, I need to get adorner layer from targetItemContainer and not targetItemsControl. // This way I get the AdornerLayer within ScrollContentPresenter, and not the one under AdornerDecorator (Snoop is awesome). // If I used targetItemsControl, the adorner would hang out of ItemsControl when there's a horizontal scroll bar. var adornerLayer = AdornerLayer.GetAdornerLayer(this.targetItem); this.insertionAdorner = new InsertionAdorner(this.isInFirstHalf, this.targetItem, adornerLayer); } }
private void ShowAdorner() { if (insertionAdorner == null) { insertionAdorner = new InsertionAdorner( listBox, true, new Pen(listBox.Foreground ?? Brushes.Black, 2), AdornerLayer); } }
protected override void OnRender(DrawingContext drawingContext) { int insertionIndex = TabTearOffBehavior.DetermineInsertionIndex(this.AdornedElement, this._mouseEventArgs, this._orientation); ITabTearOffHandler handler = TabTearOffBehavior.GetHandler(this.AdornedElement); TabControl activeTabControl = TabTearOffBehavior._activeTabItem == null ? null : (TabControl)ItemsControl.ItemsControlFromItemContainer(TabTearOffBehavior._activeTabItem); if (activeTabControl == null || !this.AdornedElement.Equals(activeTabControl) && !handler.AllowTargetedDrop(activeTabControl.ItemContainerGenerator.ItemFromContainer(TabTearOffBehavior._activeTabItem), activeTabControl, activeTabControl.ItemContainerGenerator.IndexFromContainer(TabTearOffBehavior._activeTabItem), this.AdornedElement, insertionIndex) || this.AdornedElement.Equals(activeTabControl) && !handler.AllowReorder(activeTabControl.ItemContainerGenerator.ItemFromContainer(TabTearOffBehavior._activeTabItem), activeTabControl, activeTabControl.ItemContainerGenerator.IndexFromContainer(TabTearOffBehavior._activeTabItem), insertionIndex)) { return; } int index = Math.Min(insertionIndex, this.AdornedElement.Items.Count - 1); UIElement container; if ((container = (UIElement)this.AdornedElement.ItemContainerGenerator.ContainerFromIndex(index)) == null) { return; } Rect itemRect = new Rect(container.TranslatePoint(default(Point), this.AdornedElement), container.RenderSize); Point point1, point2; double rotation; if (this._orientation == Orientation.Vertical) { if (insertionIndex == this.AdornedElement.Items.Count) { itemRect.Y += container.RenderSize.Height; } point1 = new Point(itemRect.X - InsertionAdorner.Size, itemRect.Y); point2 = new Point(itemRect.Right + InsertionAdorner.Size, itemRect.Y); rotation = 0; } else { if (insertionIndex == this.AdornedElement.Items.Count) { itemRect.X += container.RenderSize.Width; } point1 = new Point(itemRect.X, itemRect.Y - InsertionAdorner.Size); point2 = new Point(itemRect.X, itemRect.Bottom + InsertionAdorner.Size); rotation = 90d; } InsertionAdorner.DrawArrow(drawingContext, point1, rotation); InsertionAdorner.DrawArrow(drawingContext, point2, 180d + rotation); }
private void CreateInsertionAdorner(ItemsControl itemsControl, DependencyObject dependencyObject) { DestroyInsertionAdorner(); if (itemsControl == null || dependencyObject == null) { return; } var container = itemsControl.ContainerFromElement(dependencyObject) as FrameworkElement; if (container != null) { _insertionAdorner = new InsertionAdorner(container); return; } var lastcontainer = itemsControl.ItemContainerGenerator .ContainerFromIndex(itemsControl.Items.Count - 1) as FrameworkElement; if (lastcontainer != null) { _insertionAdorner = new InsertionAdorner(lastcontainer, true); } }
private static void TabControl_MouseLeaveOrLostCapture(object sender, MouseEventArgs e) { TabControl tabControl = (TabControl)sender; tabControl.PreviewMouseLeftButtonUp -= TabTearOffBehavior.TabControl_PreviewMouseLeftButtonUp; tabControl.PreviewMouseMove -= TabTearOffBehavior.TabControl_PreviewMouseMove; tabControl.MouseLeave -= TabTearOffBehavior.TabControl_MouseLeaveOrLostCapture; tabControl.LostMouseCapture -= TabTearOffBehavior.TabControl_MouseLeaveOrLostCapture; if (TabTearOffBehavior._adorner != null) { TabTearOffBehavior._adorner.Detach(); TabTearOffBehavior._adorner = null; } if (TabTearOffBehavior._dragWindow != null) { TabTearOffBehavior._dragWindow.Close(); TabTearOffBehavior._dragWindow = null; } TabTearOffBehavior._dragStartPosition = default(Point); TabTearOffBehavior._activeTabItem = null; e.Handled = true; }
private static PathGeometry CreateArrow() { PathFigure figure = new PathFigure { StartPoint = new Point(InsertionAdorner.Size, 0) }; InsertionAdorner.CreateLineSegments( figure, new Point(0, -InsertionAdorner.Size), new Point(0, -InsertionAdorner.Size / 3d), new Point(-InsertionAdorner.Size, -InsertionAdorner.Size / 3d), new Point(-InsertionAdorner.Size, InsertionAdorner.Size / 3d), new Point(0, InsertionAdorner.Size / 3d), new Point(0, InsertionAdorner.Size), new Point(InsertionAdorner.Size, 0) ); PathGeometry arrow = new PathGeometry { Figures = { figure } }; figure.Freeze(); arrow.Freeze(); return(arrow); }
private static void TabControl_PreviewMouseMove(object sender, MouseEventArgs e) { TabControl tabControl = (TabControl)sender; Point point = e.GetPosition(tabControl); if (tabControl.IsMouseCaptured) { TabTearOffBehavior.UpdateDragWindowLocation(tabControl); Window dropWindow = TabTearOffBehavior.GetWindowMouseIsOver(e); if (dropWindow == null) { return; } if (!dropWindow.IsActive) { dropWindow.Activate(); } ITabTearOffHandler targetHandler; TabControl targetTabControl = TabTearOffBehavior.FindTargetTabControl(dropWindow, out targetHandler); Panel panel = ControlMethods.GetPanel(targetTabControl); if (TabTearOffBehavior.IsMouseInDropLocation(e, targetTabControl, panel)) { if (TabTearOffBehavior._adorner == null || !TabTearOffBehavior._adorner.AdornedElement.Equals(targetTabControl)) { if (TabTearOffBehavior._adorner != null) { TabTearOffBehavior._adorner.Detach(); } TabTearOffBehavior._adorner = new InsertionAdorner(targetTabControl, panel.GetOrientation()); } TabTearOffBehavior._adorner.UpdateLocation(e); } else if (TabTearOffBehavior._adorner != null) { TabTearOffBehavior._adorner.Detach(); TabTearOffBehavior._adorner = null; } } else if (TabTearOffBehavior.IsSufficientDragMove(point)) { Rectangle contentRectangle = TabTearOffBehavior.CreateRectangle((Visual)TabTearOffBehavior.GetContent(tabControl)); Rectangle tabItemRectangle = TabTearOffBehavior.CreateRectangle(TabTearOffBehavior._activeTabItem); Panel.SetZIndex(tabItemRectangle, 10); StackPanel stackPanel = new StackPanel { Orientation = tabControl.TabStripPlacement == Dock.Right || tabControl.TabStripPlacement == Dock.Left ? Orientation.Horizontal : Orientation.Vertical, Children = { tabItemRectangle } }; stackPanel.Children.Insert(tabControl.TabStripPlacement == Dock.Right || tabControl.TabStripPlacement == Dock.Bottom ? 0 : 1, contentRectangle); TranslateTransform translateTransform = new TranslateTransform(); switch (tabControl.TabStripPlacement) { case Dock.Bottom: translateTransform.Y = -1d; break; case Dock.Left: translateTransform.X = 1d; break; case Dock.Right: translateTransform.X = -1d; break; case Dock.Top: translateTransform.Y = 1d; break; } tabItemRectangle.RenderTransform = translateTransform; TabTearOffBehavior._dragWindow = new Window { Topmost = true, AllowsTransparency = true, WindowStyle = WindowStyle.None, IsHitTestVisible = false, SizeToContent = SizeToContent.WidthAndHeight, Background = Brushes.Transparent, Content = new Border { Child = stackPanel, Opacity = 0.75 } }; TabTearOffBehavior.UpdateDragWindowLocation(tabControl); TabTearOffBehavior._dragWindow.Show(); tabControl.MouseLeave -= TabTearOffBehavior.TabControl_MouseLeaveOrLostCapture; tabControl.CaptureMouse(); e.Handled = true; } }