static void present_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { foreach (var item in ReceivingElements.Where(x => (x.Value == sender.GetType() || x.Value == null) && GetIsMouseOver(x.Key))) { IDropViewModel dropViewModel = item.Key.DataContext as IDropViewModel; dropViewModel.SetValues(sender.GetType(), new object[] { (sender as FrameworkElement).DataContext }); SetIsMouseOver(item.Key, false); ICommand cmdSet = GetSetItemsCommand(item.Key); if (cmdSet != null) { cmdSet.Execute((sender as FrameworkElement).DataContext); } (sender as Window).Close(); } }
static void present_LocationChanged(object sender, EventArgs e) { //просто проверяем соответствие расположения окна относительно типавых родителей размещения Window w = sender as Window; Rect rect = new Rect(w.Left, w.Top, w.Width, w.Height); bool istry = false; foreach (var item in ReceivingElements.Where(x => x.Value == w.GetType() || x.Value == null).ToArray()) { if (PresentationSource.FromVisual(item.Key) != null) { Rect parent = new Rect(item.Key.PointToScreen(new Point()), new Size((item.Key as FrameworkElement).ActualWidth, (item.Key as FrameworkElement).ActualHeight)); if (parent.IntersectsWith(rect)) { if (!istry) { SetIsMouseOver(item.Key, true); istry = true; } else { SetIsMouseOver(item.Key, false); } } else { SetIsMouseOver(item.Key, false); } } else { ReceivingElements.Remove(item.Key); } // подумай как можно убирать элементы без регистрации } }
static void b_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { if (e.MouseDevice.LeftButton == MouseButtonState.Pressed && initObject == sender) { var currenPoint = e.GetPosition(null); if ((startPoint.X > currenPoint.X + 10 || startPoint.X < currenPoint.X - 10) || (startPoint.Y > currenPoint.Y + 10 || startPoint.Y < currenPoint.Y - 10)) { startPoint = currenPoint; Type typePresentary = GetUseDrag(sender as DependencyObject); //var present = DynamicModuleLambdaCompiler.CreateWindow(typePresentary); var present = (Window)DynamicModuleLambdaCompiler.CreateInstance(typePresentary); if (present != null) { Point p = (sender as Visual).PointToScreen(new Point()); //понадобится метрика для расчета текущего положения нового окна //и команда обработки текущего положения ICommand cmdPoint = GetOnPoint((DependencyObject)sender); if (cmdPoint != null) { cmdPoint.Execute(new Tuple <object, Point>(((FrameworkElement)sender).DataContext, p)); } else { present.Top = p.Y; present.Left = p.X; } present.DataContext = (sender as FrameworkElement).DataContext; present.Width = present.Height = (sender as FrameworkElement).ActualWidth; //подключение проверки перемещения окна present.LocationChanged += new EventHandler(present_LocationChanged); present.Focus(); present.Topmost = true; if (GetStays(sender as DependencyObject)) { present.PreviewMouseLeftButtonUp += new MouseButtonEventHandler(present_MouseLeftButtonUp); } present.Show(); present.DragMove(); //получается что сдесь мыш была опущена следовательно объект нужно переместить в область управления foreach (var item in ReceivingElements.Where(x => (x.Value == typePresentary || x.Value == null) && GetIsMouseOver(x.Key))) { IDropViewModel dropViewModel = item.Key.DataContext as IDropViewModel; dropViewModel.SetValues(typePresentary, new object[] { (sender as FrameworkElement).DataContext }); dropViewModel.SetValues(item.Key, new object[] { (sender as FrameworkElement).DataContext }); SetIsMouseOver(item.Key, false); ICommand cmdSet = GetSetItemsCommand(item.Key); if (cmdSet != null) { cmdSet.Execute((sender as FrameworkElement).DataContext); } ICommand cmdSet1 = GetSetItemsCommand((DependencyObject)sender); if (cmdSet1 != null) { cmdSet1.Execute((sender as FrameworkElement).DataContext); } present.Close(); break; } //так же забываем про последний сет (не понятно зачем это) //ICommand cmdSetFine = GetSetItemsCommand((DependencyObject)sender); //if (cmdSetFine != null) // cmdSetFine.Execute(((FrameworkElement)sender).DataContext); //и в итоге если ниодного объекта управления нет проверяем состояние if (!GetStays(sender as DependencyObject)) { present.Close(); } else { ICommand cmdSetFine = GetSetItemsCommand((DependencyObject)sender); if (cmdSetFine != null) { cmdSetFine.Execute(((FrameworkElement)sender).DataContext); } } initObject = null; Console.WriteLine(present.Left + ";" + present.Top); } } } }