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 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); } } } }