Как сделать Grid-подобный пользовательский элемент управления для этих требований - PullRequest
0 голосов
/ 31 марта 2012

Мне нужен элемент управления, имеющий следующие функции:

  1. Должно быть возможно использовать его в xaml для разработки.
  2. Он должен содержать несколько дочерних элементов одного типа. Например, Button.
  3. Эти дочерние элементы будут иметь фиксированные размеры. Элемент управления должен выяснить, какое максимальное количество дочерних элементов он может полностью отобразить по вертикали и горизонтали (частично не может показать ни одного дочернего элемента). И показывать только этих детей, но оставлять их невидимыми для дальнейшего использования. - Я думаю, что я могу выполнить это требование с Grid.
  4. Должна быть возможность анимировать эти дочерние элементы - я думаю, это не проблема.

Я пытался написать собственный элемент управления для этого. Я унаследовал от Grid и, увидев, что Grid реализует IAddChild, я подумал, что смогу отловить добавляемые элементы, если переопределю AddChild. Но теперь я обнаружил, что для AddChild в Grid также нет реализации! Кажется, я не могу так поступить. С чего мне начать?

РЕДАКТИРОВАТЬ: Благодаря указателям Алана, я получил это работает ...

public class AutoLayoutingPanel : Panel
{
    protected override Size MeasureOverride(Size availableSize)
    {
        Size size = new Size();
        size.Height = double.MaxValue;
        size.Width = double.MaxValue;

        foreach (UIElement child in Children)
        {
            child.Measure(size);
            size.Height += child.DesiredSize.Height;
            size.Width += child.DesiredSize.Width;
        }

        return availableSize;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        ArrangeGrid(finalSize);
        return finalSize;
    }

    private void ArrangeGrid(Size finalSize)
    {
        foreach (UIElement child in Children)
        {
            child.Visibility = Visibility.Hidden;
        }

        Size maxCellSize = new Size();

        foreach (UIElement child in Children)
        {
            maxCellSize.Height = Math.Max(child.DesiredSize.Height, maxCellSize.Height);
            maxCellSize.Width = Math.Max(child.DesiredSize.Width, maxCellSize.Width);
        }

        int rowCount = (int)Math.Floor(finalSize.Height / maxCellSize.Height);
        int colCount = (int)Math.Floor(finalSize.Width / maxCellSize.Width);

        int row = 0, col = 0;
        foreach (UIElement child in Children)
        {
            if (row < rowCount && col < colCount)
            {
                Rect pos = new Rect(col * maxCellSize.Width, row * maxCellSize.Height, maxCellSize.Width, maxCellSize.Height);
                child.Visibility = System.Windows.Visibility.Visible;
                child.Arrange(pos);
            }
            else
            {
                break;
            }

            if (++row >= rowCount)
            {
                row = 0;
                ++col;
            }
        }
    }
}

1 Ответ

1 голос
/ 31 марта 2012

Я думаю, вам нужно будет создать пользовательскую панель макета, а не пытаться наследовать от Grid (что касается интерфейса IAddChild, он реализован с использованием EIMI и поэтому не виден и не может быть переопределен извне). Здесь является хорошей отправной точкой.

(Кроме того, вам нужно подумать о том, как вы хотите ограничить тип дочерних элементов управления, которые могут храниться в вашем элементе управления. Использование обобщений было бы возможным, но у меня есть сомнения по поводу поддержки обобщений XAML.)

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