protected override Size MeasureOverride(Size availableSize) { // определяем размеры элементов формы // padding не учитывается, по необходимости добавить в формулы BlockSize = 0; if (Tetris == null) { return(new Size()); } double BlockWidth; double BlockHeight; Size MaxSize = new Size(Double.PositiveInfinity, Double.PositiveInfinity); PanelTank.Margin = new Thickness(PanelTankMargin.Left, PanelTankMargin.Top, PanelTankMargin.Right, PanelTankMargin.Bottom); // размеры боковых панелей GridNext.Width = MaxNextWidth * NextBlockSize; GridNext.Height = MaxNextHeight * NextBlockSize; GridControls.Measure(MaxSize); GridSettings.Measure(MaxSize); double SidePanelWidth = Math.Max(GridControls.DesiredSize.Width, GridSettings.DesiredSize.Width); double SidePanelHeight = Math.Max(GridControls.DesiredSize.Height, GridSettings.DesiredSize.Height); if (MainControl.UseLayoutRounding) { SidePanelWidth = Math.Ceiling(SidePanelWidth); SidePanelHeight = Math.Ceiling(SidePanelHeight); } PanelControls.Width = SidePanelWidth; PanelControls.Height = SidePanelHeight; PanelSettings.Width = SidePanelWidth; PanelSettings.Height = SidePanelHeight; // размеры элемента в стакане if (availableSize.Width < Double.PositiveInfinity) { BlockWidth = (availableSize.Width - SidePanelWidth * 2 - PanelTank.Margin.Left - PanelTank.Margin.Right) / TankWidth; } else { BlockWidth = Double.PositiveInfinity; } if (availableSize.Height < Double.PositiveInfinity) { BlockHeight = (availableSize.Height - PanelTank.Margin.Top - PanelTank.Margin.Bottom) / TankHeight; } else { BlockHeight = Double.PositiveInfinity; } BlockSize = Math.Min(BlockWidth, BlockHeight); // берем минимальный размер, чтобы элементы были квадратными if (MainControl.UseLayoutRounding) { BlockSize = Math.Floor(BlockSize); // отбрасываем дробную часть, чтобы попадать в точки на форме } if (BlockSize < MinBlockSize) { BlockSize = MinBlockSize; } if (BlockSize > MaxBlockSize) { BlockSize = MaxBlockSize; } // размеры стакана PanelTank.Width = TankWidth * BlockSize + PanelTank.Margin.Left + PanelTank.Margin.Right; PanelTank.Height = TankHeight * BlockSize + PanelTank.Margin.Top + PanelTank.Margin.Bottom; // добавляем margin сверху и снизу, если остается пустое место if (PanelTank.Height < availableSize.Height && availableSize.Height < double.PositiveInfinity) { double y1 = Math.Floor((availableSize.Height - PanelTank.Height) / 2); double y2 = availableSize.Height - PanelTank.Height - y1; PanelTank.Margin = new Thickness(PanelTank.Margin.Left, PanelTank.Margin.Top + y1, PanelTank.Margin.Right, PanelTank.Margin.Bottom + y2); PanelTank.Height += y1 + y2; } // размеры всего контрола double ControlWidth = PanelTank.Width + SidePanelWidth * 2; double ControlHeight = Math.Max(PanelTank.Height, SidePanelHeight); return(new Size(ControlWidth, ControlHeight)); }