Равномерная сетка Строки и Колонны - PullRequest
1 голос
/ 03 июня 2010

Я пытаюсь создать сетку на основе UniformGrid, чтобы показать координаты каждой ячейки, и я хочу показать значения по осям X и Y следующим образом:

   _A_ _B_ _C_ _D_
1 |___|___|___|___|
2 |___|___|___|___|
3 |___|___|___|___|
4 |___|___|___|___|

В любом случае, для этого мне нужно знать количество столбцов и строк в равномерной сетке, и я попытался переопределить 3 самых основных метода, где происходит расположение / рисование, но столбцов и строк там 0 , хотя у меня есть некоторые элементы управления в моей сетке. Какой метод я могу переопределить, чтобы моя декартова сетка знала, сколько у нее столбцов и строк?

C #:

public class CartesianGrid : UniformGrid
{
    protected override Size MeasureOverride(Size constraint)
    {
        Size size = base.MeasureOverride(constraint);

        int computedColumns = this.Columns; // always 0
        int computedRows = this.Rows; // always 0

        return size;
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        Size size = base.ArrangeOverride(arrangeSize);

        int computedColumns = this.Columns; // always 0
        int computedRows = this.Rows; // always 0

        return size;
    }

    protected override void OnRender(DrawingContext dc)
    {`enter code here`
        int computedColumns = this.Columns; // always 0
        int computedRows = this.Rows; // always 0

        base.OnRender(dc);
    }
}

XAML:

<local:CartesianGrid>
    <Label Content="Hello" />
    <Label Content="Hello" />
    <Label Content="Hello" />
    <Label Content="Hello" />
    <Label Content="Hello" />
    <Label Content="Hello" />
</local:CartesianGrid>

Любая помощь очень ценится. Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Нет выставленной собственности, которая дает вам эту информацию. Если у вас есть отражатель, вы можете увидеть расчет, который они выполняют в методе UpdateComputedValues, чтобы найти количество строк и столбцов, которые они используют.

В случае, когда Rows, Columns и FirstColumn равны нулю, вы можете использовать что-то вроде этого

int numVisibleChildren = this.Children.Count((c) => c.Visibility != Visibility.Collapsed);
int numColumns = (int)Math.Ceiling(Math.Sqrt(numVisibleChildren));
int numRows = (int)Math.Floor(Math.Sqrt(numVisibleChildren));

Я на самом деле не запускал код, хотя, возможно, есть некоторые опечатки.

1 голос
/ 03 июня 2010

Вот полное решение, обрабатывает указание или не указание столбцов и строк UniformGrid:

public class CartesianGrid : UniformGrid
{
    private int _columns;
    private int _rows;
    private int _margin = 20;

    public CartesianGrid()
    {
        // add some margin so the letters and numbers do show up
        this.Margin = new Thickness(_margin, _margin, 0, 0);
    }

    protected override void OnRender(DrawingContext dc)
    {
        double xOffset = (this.RenderSize.Width / _columns);
        double yOffset = (this.RenderSize.Height / _rows);

        double xCenterOffset = xOffset / 2;
        double yCenterOffset = yOffset / 2.3;

        for (int i = 0; i < _columns; i++)
        {
            dc.DrawText(
                new FormattedText((i + 1).ToString(),
                CultureInfo.CurrentCulture,
                FlowDirection.LeftToRight,
                new Typeface("Arial"),
                20,
                Brushes.Black), new Point((i * xOffset) + xCenterOffset, _margin * -1));
        }

        for (int i = 0; i < _rows; i++)
        {
            dc.DrawText(
                new FormattedText(((char)(i + 65)).ToString(),
                CultureInfo.CurrentCulture,
                FlowDirection.LeftToRight,
                new Typeface("Arial"),
                20,
                Brushes.Black), new Point(_margin * -1, (i * yOffset) + yCenterOffset));
        }

        base.OnRender(dc);
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        if (this.Columns != 0 && this.Rows != 0)
        {
            _rows = this.Rows;
            _columns = this.Columns;

            return base.ArrangeOverride(arrangeSize);
        }
        else
        {
            Size arrangedSize = base.ArrangeOverride(arrangeSize);

            double maxChildDesiredWidth = 0.0;

            double maxChildDesiredHeight = 0.0;

            //  Measure each child, keeping track of max desired width & height.  
            for (int i = 0, count = Children.Count; i < count; ++i)
            {
                UIElement child = Children[i];

                Size childDesiredSize = child.DesiredSize;

                if (maxChildDesiredWidth < childDesiredSize.Width)
                {
                    maxChildDesiredWidth = childDesiredSize.Width;
                }
                if (maxChildDesiredHeight < childDesiredSize.Height)
                {
                    maxChildDesiredHeight = childDesiredSize.Height;
                }
            }

            if (maxChildDesiredHeight == 0 || maxChildDesiredWidth == 0)
                return arrangedSize;

            _columns = Convert.ToInt32(Math.Floor(this.DesiredSize.Width / maxChildDesiredWidth));
            _rows = Convert.ToInt32(Math.Floor(this.DesiredSize.Height / maxChildDesiredHeight));

            return arrangedSize;
        }
    }
}

Кстати, это то, чего я хотел достичь:

http://wpfdude.blogspot.com/2010/06/cartesian-grid.html

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...