예제 #1
0
        /// <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);
        }
예제 #2
0
        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;
                }
            }
        }