Нужна помощь в понимании WPF MeasureOverride и ArrangeOverride бесконечности и 0 размеров - PullRequest
5 голосов
/ 07 апреля 2010

Я пытаюсь создать простую панель, которая содержит одного дочернего элемента и привязывает его к ближайшим размерам сетки. Мне трудно понять, как это сделать, переопределив MeasureOverride и ArrangeOverride.

Вот что мне нужно: я хочу, чтобы моя панель сообщила своему владельцу, что (а) она хочет быть как можно большего размера, затем (б) когда она узнает, что это за размер, она изменит себя и свой размер дочерний элемент в соответствии с ближайшей меньшей точкой привязки. Поэтому, если мы приближаемся к 10-м годам, и я могу находиться в регионе размером не более 192x184, панель скажет своему родительскому контейнеру «мой фактический размер будет 190x180». Таким образом, все, что граничит с моим контролем, сможет выровняться по его краям, а не по потенциальному пространству.

Когда я помещаю свою панель в сетку, я получаю либо 0, либо PositiveInfinity (я забыл) за входящий размер в переопределениях, но мне нужно знать, "насколько велика моя площадь на самом деле?" не бесконечности ..

Часть проблемы, я думаю, в том, что WPF считает магические значения PositiveInfinity и 0 для размера. Мне нужен способ сказать через MeasureOverride «Я могу быть настолько большим, насколько вы позволите мне», а в ArrangeOverride фактически изменить размер до привязанного.

Или я поступаю совершенно неправильно? Измерение и компоновка выглядит очень сложно, просто немного побродив по коду для стандартных панелей в Reflector.

1 Ответ

5 голосов
/ 07 апреля 2010

На шаге измерения, если WPF отправляет вам бесконечность, вы должны сказать ему, насколько большим вы хотите быть. Если он отправляет 0, то буквально нет места для вашего макета. На шаге аранжировки вам сообщат, сколько места доступно для макета, что, скорее всего, будет отличаться от размера, который вы указали на шаге измерения. Вы не можете вернуть бесконечность ни на одном этапе. Следующий код должен выполнить то, что вам нужно (обратите внимание, что я предполагаю свойство дочернего элемента UIElement):

protected overrride Size MeasureOverride(Size availableSize)
{
    Child.Measure(availableSize);
    return Child.DesiredSize;
}

protected override Size ArrangeOverride(Size finalSize)
{
    int w = (((int)finalSize.Width) / SnapPrecision) * SnapPrecision;
    int h = (((int)finalSize.Height) / SnapPrecision) * SnapPrecision;

    Child.Arrange(new Rect(0, 0, w, h));
    return new Size(w, h);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...