Как вы используете MeasureOverride в Silverlight?
Я думаю, что понял, как работает MeasureOverrride, но я пытаюсь использовать его в очень простом случае, и это не работает... Так что теперь я не уверен... После использования Measureoverride мне нужно использовать Arrageoverride тоже или система сделает это за меня? Ситуация такова: у меня есть класс LinearLayout, унаследованный от Panel, и он имеет два поля, называемых wrapwidht и wrapheigh, если они истинны, то ширина или высота LinearLayout должны быть такими, как этого требуют его дочерние элементы. поэтому мой Measureoveride выглядит так:
protected override Size MeasureOverride(Size availableSize) {
Size panelDesiredSize = new Size();
if ((this.widthWrap) || (this.heightWrap))
{
foreach (UIElement elemento in this.Children)
{
System.Diagnostics.Debug.WriteLine(((FrameworkElement)elemento).DesiredSize.ToString());
if (this.Orientation.Equals(System.Windows.Controls.Orientation.Vertical))
{
if (this.widthWrap)
{
//the widest element will determine containers width
if (panelDesiredSize.Width < ((FrameworkElement)elemento).Width)
panelDesiredSize.Width = ((FrameworkElement)elemento).Width;
}
//the height of the Layout is determine by the sum of all the elment that it cointains
if (this.heightWrap)
panelDesiredSize.Height += ((FrameworkElement)elemento).Height;
}
else
{
if (this.heightWrap)
{
//The highest will determine the height of the Layout
if (panelDesiredSize.Height < ((FrameworkElement)elemento).Height)
panelDesiredSize.Height = ((FrameworkElement)elemento).Height;
}
//The width of the container is the sum of all the elements widths
if (this.widthWrap)
panelDesiredSize.Width += ((FrameworkElement)elemento).Width;
}
}
}
System.Diagnostics.Debug.WriteLine("desiredsizzeeeeeee" + panelDesiredSize);
return panelDesiredSize;
}
Дети, которых я добавляю в LinerLayout, - это 3 кнопки, но ничего не нарисовано... даже если поле panelDesiredSize правильно... поэтому, возможно, я не понял, как это работает очень хорошо. Если кто-нибудь может мне помочь, было бы очень приятно:-)
3 ответа
Посмотрите мой ответ в предыдущем посте, похожем на ваш: система двухпроходного макета в WPF и Silverlight
Ответ заключается в том, что нет, вам не нужно переопределять ArrangeOverride, но какой смысл использовать MeasureOverride, если вы не собираетесь использовать ArrangeOverride?
Вы должны вызвать метод Measure для ребенка. Смотрите пример здесь: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride.aspx
Вы должны позвонить Мера на "Elemento". Именно во время измерения Silverlight создает элементы пользовательского интерфейса, объявленные в шаблоне элемента, поскольку они необходимы для фактического измерения и определения желаемого размера. Затем вы должны использовать elemento.DesiredSize.Width и Height, чтобы найти желаемый размер для вашего panelDesiredSize.