コード例 #1
0
        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));
        }