Родителите измерват размера на децата

Пиша персонализиран панел и бих искал да знам как да кажа на децата си, че когато трябва да премерят, техният родител също трябва да направи повторното измерване.

Като пример, едно от децата променя ширината си и родителят също трябва да преизмери отново, карайки своя родител също да направи повторното измерване и след това родителят на неговия родител и родителят на неговия родител и т.н.. Все едно да се качите нагоре по VisualTree. Как да направя това?

Ето кода на измерване на панела.. но как да кажа на родителя също да измери отново

protected override Size MeasureOverride(Size availableSize)
{
 double x;
 double y;
 var children = this.InternalChildren;
 for (int i = 0; i < children.Count; i++)
     {
       UIElement child = children[i];
       child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity);
       y += child.DesiredSize.Height;
       x = Math.Max(x, child.DesiredSize.Width);
      }
 return new Size(x, y);
}

person cyberist    schedule 09.02.2013    source източник
comment
Не прави така. Това се прави от WPF автоматично. Просто опитайте.   -  person Clemens    schedule 10.02.2013
comment
добре, това не става автоматично.. ако кажа на панела, че имате размер 200 x 200 и след това променя ширината на дете на 300, панелът не се актуализира.. което е моето, аз задавам този въпрос   -  person cyberist    schedule 10.02.2013
comment
Трябва да предоставите повече информация за това какво се опитвате да постигнете и защо и да покажете някакъв код. Хората от Stackoverflow не могат да предложат помощ, ако сме оставени да гадаем.   -  person Benjamin Gale    schedule 10.02.2013
comment
това е моята публикация.. има код stackoverflow .com/questions/14775226/   -  person cyberist    schedule 10.02.2013
comment
Ако информацията е същата, тогава не трябва да публикувате друг въпрос. Ако е различно и изисква друг въпрос, моля, отделете време, за да предоставите информацията тук. Също така, опитахте ли предложенията, дадени за другия въпрос?   -  person Benjamin Gale    schedule 10.02.2013


Отговори (1)


Разгледайте този много прост потребителски панел, който подрежда дъщерни елементи в горния ляв ъгъл:

public class MyPanel : Panel
{
    protected override Size MeasureOverride(Size availableSize)
    {
        Trace.TraceInformation("MeasureOverride");

        var size = new Size();

        foreach (UIElement element in InternalChildren)
        {
            element.Measure(availableSize);

            size.Width = Math.Max(size.Width, element.DesiredSize.Width);
            size.Height = Math.Max(size.Height, element.DesiredSize.Height);
        }

        return size;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        Trace.TraceInformation("ArrangeOverride");

        foreach (UIElement element in InternalChildren)
        {
            element.Arrange(new Rect(element.DesiredSize));
        }

        return finalSize;
    }
}

Ако го използвате, както е показано по-долу с дете на бутон

<local:MyPanel>
    <local:MyPanel>
        <Button Width="100" Height="100" Click="Button_Click"/>
    </local:MyPanel>
</local:MyPanel>

и манипулатор Button_Click, който преоразмерява бутона

private void Button_Click(object sender, RoutedEventArgs e)
{
    ((FrameworkElement)sender).Width += 20;
}

ще забележите, че при всяко натискане на бутон панелът родител и баба и дядо ще бъдат измерени и подредени. Резултатът от проследяването изглежда така:

CustomPanelTest.vshost.exe Information: 0 : MeasureOverride
CustomPanelTest.vshost.exe Information: 0 : MeasureOverride
CustomPanelTest.vshost.exe Information: 0 : ArrangeOverride
CustomPanelTest.vshost.exe Information: 0 : ArrangeOverride

Следователно няма нужда да извиквате Measure или Arrange ръчно на родителски панел.

person Clemens    schedule 09.02.2013
comment
Преминавам към моя панел 200x200 и след това тази стойност се предава на децата.. но когато преоразмеря дете, панелът не се актуализира и не се измерва отново, така че предполагам, че не работи за мен, защото използвам фиксирани стойности на размера. какво трябва да направя, за да работи - person cyberist; 10.02.2013
comment
Никога не трябва да коригирате размера на панел, когато в същото време искате той да реагира динамично на промените в размера на дъщерния елемент. - person Clemens; 10.02.2013
comment
добре, какво споменавам, че връщам 200x200 като размер в замяната на мерките в панела, но след това, след като ширината на което и да е дете е по-голяма от 200, панелът не се измерва отново - person cyberist; 10.02.2013
comment
Може би трябва да публикувате своя код MeasureOverride и ArrangeOverride. - person Clemens; 10.02.2013
comment
Къде са тези 200x200? И твоето ArrangeOverride също би било интересно. - person Clemens; 10.02.2013
comment
availableSize е 200x200.. прозорецът като основен елемент е 200x200 откъде другаде ще дойде хехе - person cyberist; 11.02.2013
comment
Вашият примерен код не показва, че връщате availableSize. Всъщност то се игнорира напълно. Връщането на availableSize така или иначе би било грешно, тъй като трябва да върнете желания размер на панела (както правилно правите в примера). И така, за какво говорим тук? Можете да прочетете отново документацията на MeasureOverride за да получите снимка. - person Clemens; 11.02.2013