Как вы используете MeasureOverride в Silverlight? - PullRequest
0 голосов
/ 14 апреля 2011

Мне кажется, я понял, как работает 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 ]

2 голосов
/ 14 апреля 2011

Проверьте мой ответ в предыдущем посте, похожем на ваш: Двухпроходная система макетов в WPF и Silverlight

Ответ таков: нет, у вас нет есть переопределить ArrangeOverride, но какой смысл использовать MeasureOverride, если вы не собираетесь использовать ArrangeOverride?

0 голосов
/ 14 апреля 2017

Вы должны вызвать Measure на "elemento". Именно во время измерения Silverlight создает элементы пользовательского интерфейса, объявленные в шаблоне элемента, поскольку они необходимы для фактического измерения и определения желаемого размера. Затем вы должны использовать elemento.DesiredSize.Width и Height, чтобы найти желаемый размер для вашего panelDesiredSize.

0 голосов
/ 14 апреля 2011

Вы должны вызвать метод Measure для ребенка. Смотрите пример здесь: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride.aspx

...