WPF MeasureOverride и ArrangeOverride

Мой вопрос здесь скорее теоретический, нежели функциональный. Так что я ищу ответ, который может быть подкреплен некоторой документацией.

Я нахожусь в ситуации, когда мне нужно сделать некоторые пользовательские измерения / меры для детей элемента управления wpf?

  1. Можно ли измерять дочерние элементы на основе других ограничений размера, а не того, который получен в качестве параметра.
  2. Какой-то псевдокод того, чего я пытаюсь достичь:

    MeasureOverride(size)
     {
       foreach(child in children)
       { 
         if(condition)
         {
           child.measure(size)
         }
         else
         { 
           child.measure(customSize)
           if(...)
           {
             ...
           }
           ...
         }
       }
     }
    

Должна ли вся логика для этого жить внутри MeasureOverride или я должен просто вызвать measure с размером, полученным в качестве параметра для всех дочерних элементов, а затем выполнить логику внутри ArrangeOverride? Спасибо!

2 ответа

Решение

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

Дочерние элементы управления будут делать то же самое. Результатом вызова Measure для дочернего элемента является то, что DesiredSize этого дочернего элемента установлен. Опять же, это может быть что угодно, в зависимости от логики измерения ребенка. В вашем методе MeasureOverride вы можете использовать свою логику, чтобы понять возвращаемые значения DesiredSizes.

Если у вас есть логика измерения, она обязательно должна находиться в методе MeasureOverride (или вспомогательных методах), а не в ArrangeOverride. ArrangeOverride только для позиционирования.

Я уверен, что вы уже проверили это, но я все еще выложу ссылку. http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride%28v=vs.110%29.aspx

Некоторые дополнительные пункты:

  • Ваш псевдокод отсутствует, и вам нужно вернуть общий размер, использованный в MeasureOverride(). Вам нужно объединить детский DesiredSize в общий размер, который ваш контроль намеревается использовать. Вы не можете вернуть availableSize, который может быть бесконечным.
  • Когда вы получаете бесконечный размер в MeasureOverride(), вы не можете вернуть бесконечный, но 0 в порядке. В этом случае ArrangeOverride() получит весь доступный размер.
  • При расчете размера будьте осторожны, чтобы не создавать отрицательные значения. Это может легко случиться, когда DesiredSize больше доступного размера. Обрабатывать это так:

    double Остальное Width = Math.Min(0, availableabeSize.Width - DesiredSize.Width);

  • Возможно, вам нужно повторить логическую форму MeasureOverride () в ArrangeOverride(). Будьте осторожны при использовании значений, рассчитанных в MeasureOverride () в ArrangeOverride(), поскольку доступный размер часто отличается.

  • Убедитесь, что вы вызываете Measure() и Arrange() для каждого ребенка. Если вы этого не сделаете, вы не получите никаких сообщений об ошибках, но Framework будет вызывать их, возможно, с неверными параметрами размера.
Другие вопросы по тегам