private void Venue_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { if (e.OldValue is LayoutModel value && HasChanged) { HasChanged = false; Save(value); } ParentGrid.Children.Clear(); ParentGrid.RowDefinitions.Clear(); ParentGrid.ColumnDefinitions.Clear(); if (e.NewValue is LayoutModel layout) { var areas = layout.Areas.Where(x => x.Status != ModelInfo.Deleted).ToList(); if (areas.Count == 0) { return; } // create rows var rowsCout = areas.Max(x => x.CoordY); for (int i = 0; i < rowsCout; i++) { ParentGrid.RowDefinitions.Add(new RowDefinition()); } // create columns var columnCount = areas.Max(x => x.CoordX); for (int i = 0; i < columnCount; i++) { ParentGrid.ColumnDefinitions.Add(new ColumnDefinition()); } // create layouts foreach (var area in areas) { var element = new AreaGrid(); ParentGrid.Children.Add(element); SetColumn(element, area.CoordX - 1); SetRow(element, area.CoordY - 1); if (area.Seats.Count == 0) { continue; } // create seat columns var seatColumnsCount = area.Seats.Max(x => x.Number); for (int i = 0; i < seatColumnsCount; i++) { element.ParentGrid.ColumnDefinitions.Add(new ColumnDefinition()); } // create seat rows var seatRowsCount = area.Seats.Max(x => x.Row); for (int i = 0; i < seatRowsCount; i++) { element.ParentGrid.RowDefinitions.Add(new RowDefinition()); } // create seats foreach (var seat in area.Seats) { var elementSeat = new SeatLabel(); element.ParentGrid.Children.Add(elementSeat); SetColumn(elementSeat, seat.Number - 1); SetRow(elementSeat, seat.Row - 1); } } } }
private void Border_Drop(object sender, DragEventArgs e) { // checking that target cell is not a LayerGrid if (e.Source is TemplateSeat) { return; } if (e.Data.GetData(typeof(TemplateArea)) is TemplateArea || e.Data.GetData(typeof(AreaGrid)) is AreaGrid) { return; } var mousePosition = new { e.GetPosition(ParentBorder).X, e.GetPosition(ParentBorder).Y }; var columnPositionPercent = (int)(mousePosition.X * 100 / ParentBorder.ActualWidth); var rowPositionPercent = (int)(mousePosition.Y * 100 / ParentBorder.ActualHeight); if (!ParentGrid.Children.Cast <SeatLabel>().Any()) { ParentGrid.ColumnDefinitions.Add(new ColumnDefinition()); ParentGrid.RowDefinitions.Add(new RowDefinition()); } else if (columnPositionPercent < rowPositionPercent) // Row { if (!CheckPositionSeat(e.GetPosition(ParentBorder))) { ParentGrid.RowDefinitions.Add(new RowDefinition()); } } else if (rowPositionPercent < columnPositionPercent) // Column { if (!CheckPositionSeat(e.GetPosition(ParentBorder))) { ParentGrid.ColumnDefinitions.Add(new ColumnDefinition()); } } HasChanged = true; UIElement element = null; if (e.Data.GetData(typeof(SeatLabel)) is SeatLabel seat) { element = seat; } else if (e.Data.GetData(typeof(TemplateSeat)) is TemplateSeat) { element = new SeatLabel(); ParentGrid.Children.Add(element); } if (CheckPositionSeat(e.GetPosition(ParentBorder))) { SetColumn(element, GetTargetColumn(mousePosition.X)); SetRow(element, GetTargetRow(mousePosition.Y)); } //clear empty row and column if (ParentGrid.Children.Cast <SeatLabel>().All(x => GetRow(x) != ParentGrid.RowDefinitions.Count - 1)) { ParentGrid.RowDefinitions.RemoveAt(ParentGrid.RowDefinitions.Count - 1); } if (ParentGrid.Children.Cast <SeatLabel>().All(x => GetColumn(x) != ParentGrid.ColumnDefinitions.Count - 1)) { ParentGrid.ColumnDefinitions.RemoveAt(ParentGrid.ColumnDefinitions.Count - 1); } }