/// <summary> /// Событие окончания перемещения карт. /// Просматриваются новые позиции карты и определяется, куда их переместить. /// </summary> /// <param name="tableauView">таблица, из которой были перемещены карты</param> /// <param name="draggableCards">перемещаемые карты</param> public void DragCompleted(TableauView tableauView, DraggableCards draggableCards) { CardView bottomCardView = draggableCards.BottomCardView; Rect cardRect = GetCardRect(bottomCardView); // Просматриваем перемещение по стопкам. for (int i = 0; i < GameTable.Foundations * 2; i++) { FoundationView view = _foundationViews[i]; Rect rect = view.Bounds; if (cardRect.IntersectsWith(rect)) { // Проверка правых стопок. if (i >= GameTable.Foundations && draggableCards.Cards.Count != 13) { CancelMove(draggableCards); return; } if (!view.Foundation.IsCorrectMove(bottomCardView.Card)) { CancelMove(draggableCards); return; } // Добавляем карты в стопку. _table.MoveCards(draggableCards.Cards, tableauView.Tableau, view.Foundation); tableauView.RefreshView(); view.RefreshView(); CheckGameOver(); return; } } // Просматриваем перемещение по таблицам. for (int i = 0; i < GameTable.Tableaus; i++) { TableauView view = _tableauViews[i]; if (view.Equals(tableauView)) { continue; } Rect rect = view.Bounds; if (cardRect.IntersectsWith(rect)) { if (!view.Tableau.IsCorrectMove(bottomCardView.Card)) { CancelMove(draggableCards); return; } // Переносим карты в другую таблицу. _table.MoveCards(draggableCards.Cards, tableauView.Tableau, view.Tableau); tableauView.RefreshView(); view.RefreshView(); CheckAutoMovesToRightFoundation(); return; } } CancelMove(draggableCards); }
private void cardView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // При нажатии левой кнопки мыши проверяем, можем ли мы переместить карты // от выбранной до нижней. Если можем - создаём из них DraggableCards и перемещаем их. var view = (CardView)sender; List <Card> draggable = Tableau.GetDraggableTopCards(); for (int i = 0; i < draggable.Count; i++) { var dragCard = draggable[i]; if (view.Card.Equals(dragCard)) { // Собираем карты в новый компонент. var draggableCards = new DraggableCards(); draggableCards.Cards = draggable.GetRange(i, draggable.Count - i); // Карты в таблице скрываем. foreach (var cardView in _cardViews) { foreach (var card in draggableCards.Cards) { if (cardView.Card.Equals(card)) { cardView.Visibility = Visibility.Hidden; } } } // Добавляем новый компонент на форму. Canvas.SetTop(draggableCards, Canvas.GetTop(view)); Canvas.SetLeft(draggableCards, Canvas.GetLeft(view)); Panel.SetZIndex(draggableCards, 200); RootView.Children.Add(draggableCards); DragHelper.Drag(draggableCards, OnDragCompleted, e.GetPosition(null)); return; } } }