internal void DeleteDiagramAndLines() { if (DepartureLines != null && DepartureLines.Any()) { foreach (var dline in DepartureLines) { dline.TerminalDiagram.ArrivalLines.Remove(dline); WPFUtility.FindVisualParent <Canvas>(dline).Children.Remove(dline); } } if (ArrivalLines != null && ArrivalLines.Any()) { foreach (var aline in ArrivalLines) { aline.OriginDiagram.DepartureLines.Remove(aline); WPFUtility.FindVisualParent <Canvas>(aline).Children.Remove(aline); } } this.ArrivalLines.Clear(); this.DepartureLines.Clear(); WPFUtility.FindVisualParent <Canvas>(this).Children.Remove(this); }
public DrawLineAdorner(UIElement element, double opacity, Point point) : base(element) { _startPoint = point; _line = new Line() { Stroke = (SolidColorBrush)Application.Current.Resources["AdornerLineBrush"], StrokeThickness = 2, StrokeDashArray = new DoubleCollection(new double[] { 1, 1, 1, 1, }), //破線のスタイル X1 = point.X, Y1 = point.Y, X2 = point.X, Y2 = point.Y, }; _move = (Vector)Window.GetWindow(element).PointFromScreen(element.PointToScreen(point)); _move.Negate(); AdornerLayer adorner = AdornerLayer.GetAdornerLayer((Visual)WPFUtility.FindVisualParent <Window>(this.AdornedElement).Content); if (adorner != null) { adorner.Add(this); } }
public DraggingAdorner(UIElement element, double opacity, Point point) : base(element) { Rect bounds = VisualTreeHelper.GetDescendantBounds(element); _ghost = new Rectangle() { Height = bounds.Height, Width = bounds.Width, Fill = new VisualBrush(element) { Opacity = opacity } }; CenterPoint = point; _move = (Vector)Window.GetWindow(element).PointFromScreen(element.PointToScreen(point)); _move.Negate(); AdornerLayer adorner = AdornerLayer.GetAdornerLayer((Visual)WPFUtility.FindVisualParent <Window>(this.AdornedElement).Content); if (adorner != null) { adorner.Add(this); } }
private void AssociatedObject_MouseMove(object sender, MouseEventArgs e) { UIElement element = sender as UIElement; if (e.LeftButton == MouseButtonState.Released) { element.SetValue(StartPointProperty, null); } if (element.GetValue(StartPointProperty) == null) { return; } Point startPoint = (Point)element.GetValue(StartPointProperty); Point point = e.GetPosition(element as UIElement); if (!WPFUtility.IsDragging(startPoint, point)) { return; } DraggingAdorner adorner = new DraggingAdorner(element, 0.5, point); SetDragAdorner(element, adorner); DataObject data = new DataObject(); //set the adorner for drop action and create the clone element. data.SetData(typeof(DraggingAdorner), adorner); data.SetData(typeof(UIElement), element); ICommand dragcommand = GetDragCommand(element); //cann't drag without command if (dragcommand != null) { object parameter = GetDragCommandParameter(element); // ?? this.AssociatedObject.DataContext; if (parameter != null) { data.SetData(DataFormats.Serializable, parameter); } if (dragcommand.CanExecute(parameter)) { dragcommand.Execute(parameter); DragDrop.DoDragDrop(element, data, DragDropEffects.Copy | DragDropEffects.Move); } } adorner.Remove(); SetDragAdorner(element, null); }
private void AssociatedObject_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) { UIElement element = sender as UIElement; DraggingAdorner adorner = GetDragAdorner(element); Point point = WPFUtility.GetMousePosition(element); if (adorner != null) { adorner.Position = point; } }
internal void DeleteLine() { if (OriginDiagram != null && OriginDiagram.DepartureLines.Any()) { OriginDiagram.DepartureLines.Remove(this); } if (TerminalDiagram != null && TerminalDiagram.ArrivalLines.Any()) { TerminalDiagram.ArrivalLines.Remove(this); } WPFUtility.FindVisualParent <Canvas>(this).Children.Remove(this); }
private ConnectionDiagramBase GetSenderDiagram(object sender) { ConnectionDiagramBase element = null; if (!(sender is ConnectionDiagramBase)) { element = WPFUtility.FindVisualParent <ConnectionDiagramBase>(sender as UIElement); } else { element = sender as ConnectionDiagramBase; } return(element); }
private void AssociatedObject_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) { var element = GetSenderDiagram(sender) ?? sender as UIElement; if (element == null) { return; } DrawLineAdorner adorner = GetDraggingLineAdorner(element); Point point = WPFUtility.GetMousePosition(element); if (adorner != null) { adorner.Position = point; } }
public void InsertTab(int index, string title) { var tab = new SheetTabItem(this, title) { Height = this.canvas.Height, }; this.canvas.Width += tab.Width + 1; this.canvas.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(tab.Width + 1) }); this.canvas.Children.Add(tab); Grid.SetColumn(tab, index); tab.MouseDown += (s, e) => { var arg = new SheetTabMouseEventArgs() { Handled = false, Location = e.GetPosition(this), Index = index, MouseButtons = WPFUtility.ConvertToUIMouseButtons(e), }; if (this.TabMouseDown != null) { this.TabMouseDown(this, arg); } if (!arg.Handled) { this.SelectedIndex = index; } }; if (this.canvas.Children.Count == 1) { tab.IsSelected = true; } }
private void Tab_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { var index = this.canvas.Children.IndexOf((UIElement)sender); var arg = new SheetTabMouseEventArgs() { Handled = false, Location = e.GetPosition(this), Index = index, MouseButtons = WPFUtility.ConvertToUIMouseButtons(e), }; if (this.TabMouseDown != null) { this.TabMouseDown(this, arg); } if (!arg.Handled) { this.SelectedIndex = index; } }
private void AssociatedObject_Drop(object sender, DragEventArgs e) { //if the data type can be dropped if (e.Data.GetDataPresent(typeof(DraggingAdorner))) { UIElement element = sender as FrameworkElement; ICommand dropcommand = GetDropCommand(element); if (dropcommand != null) { object parameter = GetDropCommandParameter(element); //if (this.AssociatedObject.DataContext is IDragged) //{ // (this.AssociatedObject.DataContext as IDragged).DraggedDataContext = (e.Data.GetDataPresent(DataFormats.Serializable) ? e.Data.GetData(DataFormats.Serializable) : null); //} SetDraggedDataContext(this.AssociatedObject, (e.Data.GetDataPresent(DataFormats.Serializable) ? e.Data.GetData(DataFormats.Serializable) : null)); if (dropcommand.CanExecute(parameter)) { Point point = e.GetPosition(element); //it is will be to DroopedCanvas is not exist Canvas droppedcanvas = GetDroppedCanvas(element); UIElement dragelement = e.Data.GetDataPresent(typeof(UIElement)) ? e.Data.GetData(typeof(UIElement)) as UIElement : null; Type droppedcontroltype = dragelement != null?GetDroppedControlType(dragelement) : null; if (droppedcontroltype != null && !WPFUtility.IsCorrectType(droppedcontroltype, typeof(ContentControl))) { throw new ArgumentException("DroppedControlType is base on ContentControl."); } if (e.Data.GetDataPresent(typeof(DraggingAdorner))) { var adn = e.Data.GetData(typeof(DraggingAdorner)) as DraggingAdorner; UIElement clnele = null; bool iscopy = false; if (droppedcontroltype != null) { //TODO: Copy Control or create new control if (GetIsDuplication(dragelement)) { clnele = CreateNewContentControl(droppedcontroltype, adn.GetGhostElement() as UIElement); } else { clnele = Activator.CreateInstance(droppedcontroltype) as UIElement; } iscopy = true; } else { clnele = dragelement; } //add the clone element if (clnele != null) { Point canvaspoint = (Point)(point - adn.CenterPoint); Point oldpoint = new Point(Canvas.GetLeft(dragelement), Canvas.GetTop(dragelement)); SetConnectionLinePosition(clnele as ConnectionDiagramBase, (Point)(canvaspoint - oldpoint)); Canvas.SetLeft(clnele, canvaspoint.X); Canvas.SetTop(clnele, canvaspoint.Y); var duuid = $"{clnele.GetType().Name}_{Guid.NewGuid().ToString()}"; if (clnele is ConnectionDiagramBase) { (clnele as ConnectionDiagramBase).DiagramUUID = duuid; } else { FrameworkElementAssist.SetDiagramUUID(clnele, duuid); } if (iscopy) { if (droppedcanvas != null) { droppedcanvas.Children.Add(clnele); } } else { //??? } if (parameter != null) { dropcommand.Execute(parameter); } else { dropcommand.Execute((clnele as ContentControl)?.DataContext); } } } // } } SetDraggedDataContext(this.AssociatedObject, null); //if (this.AssociatedObject.DataContext is IDragged) //{ // (this.AssociatedObject.DataContext as IDragged).DraggedDataContext = null; //} } } if (this._adorner != null) { this._adorner.Remove(); } e.Handled = true; return; }
private void AssociatedObject_Drop(object sender, DragEventArgs e) { if (_dataType != null) { //if the data type can be dropped if (e.Data.GetDataPresent(_dataType)) { FrameworkElement element = sender as FrameworkElement; ICommand dropcommand = GetDropLineCommand(element); if (dropcommand != null) { object parameter = GetDropLineCommandParameter(element); Point point = e.GetPosition(element); var adn = e.Data.GetData(_dataType) as DrawLineAdorner; Point adnPoint = adn.Position; Canvas droppedcanvas = GetDroppedLineCanvas(element); var originelement = (e.Data.GetData(typeof(UIElement)) as FrameworkElement); //the object for ConnectionDiagram ConnectionDiagramBase origindiagram = originelement as ConnectionDiagramBase; ConnectionDiagramBase terminaldiagram = element as ConnectionDiagramBase; SetDraggedDataContext(this.AssociatedObject, e.Data.GetData(DataFormats.Serializable)); if (droppedcanvas != null) { double x1, y1, x2, y2 = 0.0; if (ConnectorPositionType.Custom.Equals(origindiagram?.ConnectorPositionType)) { //the Ghost line position x1 = adn.GetLineStartEndPosition().Item1; y1 = adn.GetLineStartEndPosition().Item2; } else { x1 = WPFUtility.GetCenterPosition(originelement, droppedcanvas).X; y1 = WPFUtility.GetCenterPosition(originelement, droppedcanvas).Y; } if (ConnectorPositionType.Custom.Equals(terminaldiagram?.ConnectorPositionType)) { //the Ghost line position x2 = adn.GetLineStartEndPosition().Item3; y2 = adn.GetLineStartEndPosition().Item4; } else { x2 = WPFUtility.GetCenterPosition(element, droppedcanvas).X; y2 = WPFUtility.GetCenterPosition(element, droppedcanvas).Y; } //the line type of custom Type linetype = GetDropLineControlType(element); if (!WPFUtility.IsCorrectType(linetype, typeof(ConnectionLineBase))) { throw new ArgumentException($"DropLineControlType is base on {nameof(ConnectionLineBase)}."); } dynamic conline; if (!typeof(DrawLineThump).Equals(linetype)) { conline = Activator.CreateInstance(linetype); if (conline is ConnectionLineBase) { //if inherit from ILinePosition if (conline is ILinePosition) { (conline as ILinePosition).X1 = x1; (conline as ILinePosition).Y1 = y1; (conline as ILinePosition).X2 = x2; (conline as ILinePosition).Y2 = y2; } } } else { conline = new Line() { X1 = x1, Y1 = y1, X2 = x2, Y2 = y2, }; } FrameworkElementAssist.SetOriginDiagram(conline, originelement); FrameworkElementAssist.SetTerminalDiagram(conline, element); //set the parameter //var dropparam = parameter ?? conline.DataContext; string lineuuid = $"{conline.GetType().Name}_{Guid.NewGuid().ToString()}"; if (dropcommand.CanExecute(parameter)) { Canvas.SetTop(conline, 0); Canvas.SetLeft(conline, 0); //add the relation of the diagram if (origindiagram != null) { origindiagram.DepartureLines.Add(conline); } if (terminaldiagram != null) { terminaldiagram.ArrivalLines.Add(conline); } //TODO:FrameworkElement???? if (droppedcanvas != null) { droppedcanvas.Children.Add(conline); } //Set the Dropping Line DataContext SetDroppingDataContext(this.AssociatedObject, conline.DataContext); dropcommand.Execute(parameter); if (conline is ConnectionLineBase) { (conline as ConnectionLineBase).LineUUID = lineuuid; } else if (conline is Line) { FrameworkElementAssist.SetLineUUID(conline, lineuuid); } } } else { dropcommand.Execute(parameter); } } } } if (this._adorner != null) { this._adorner.Remove(); } e.Handled = true; return; }
public object GetGhostElement() { //return (_ghost?.Fill as VisualBrush).Visual as UIElement; return(WPFUtility.GetUIElementSimpleClone((_ghost?.Fill as VisualBrush).Visual as UIElement)); }
private void AssociatedObject_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Released) { return; } //use the connection object base on ConnectionDiagramBase var element = GetSenderDiagram(sender) ?? sender as UIElement; if (element == null) { return; } Point point = e.GetPosition(element as UIElement); Point startPoint = (element as ConnectionDiagramBase)?.CenterPosition ?? new Point(0, 0); //change the draw line center position int centerradius = (element as ConnectionDiagramBase)?.CenterPositionRadius ?? 0; if (!WPFUtility.IsCenterDragging(startPoint, point, centerradius)) { return; } if (!WPFUtility.IsDragging(startPoint, point)) { return; } DrawLineAdorner adorner = new DrawLineAdorner(element, 0.7, point); SetDraggingLineAdorner(element, adorner); DataObject data = new DataObject(); //set the adorner for drop action and create the clone element. data.SetData(typeof(UIElement), element); data.SetData(typeof(DrawLineAdorner), adorner); ICommand dragcommand = GetDragLineCommand(element); //cann't drag without command if (dragcommand != null) { object parameter = GetDragLineCommandParameter(element); //?? this.AssociatedObject.DataContext; if (parameter != null) { data.SetData(DataFormats.Serializable, parameter); } if (dragcommand.CanExecute(parameter)) { dragcommand.Execute(parameter); DragDrop.DoDragDrop(element, data, DragDropEffects.Copy | DragDropEffects.Move); } } adorner.Remove(); SetDraggingLineAdorner(element, null); }