ArrangeOverride вызывает организацию дочерних элементов перед вызовом дополнительного кода - PullRequest
6 голосов
/ 03 февраля 2011

Хорошо, просто когда я подумал, что разобрался с системой раскладки, я врезался в кирпичную стену ...

Итак, у меня есть окно WPF с настраиваемым ItemsControl, панель Items которого является настраиваемой панелью, а каждый ItemContainer является настраиваемым элементом.

Когда в окне вызывается InvalidateArrange (), порядок вызовов ArrangeOverride () выглядит нормально, т.е.

Window -> List -> ItemsPanel -> ItemContainer -> ItemContainer -> etc...

Проблема в том, что у меня есть некоторый код, который я хочу вызвать на уровне окна после ArrangeOverride, который опирается на все ItemContainers, которые были упорядочены и измерены. Уровень окна ArrangeOverride () заканчивается до того, как у следующего элемента в дереве (списке) будет вызван его ArrangeOverride.

Есть ли способ измерить все дочерние элементы Windows, а затем вернуться к Windows ArrangeOverride (), чтобы продолжить работу с некоторым кодом, или есть событие, к которому нужно подключиться или что-то еще?

Приветствия

1 Ответ

2 голосов
/ 07 февраля 2011

Вы можете вызвать свой пользовательский код ПОСЛЕ вызова base.ArrangeOverride () в реализации ArrangeOverride вашего окна:

    protected override Size ArrangeOverride(Size arrangeBounds)
    {
        Size temp = base.ArrangeOverride(arrangeBounds);

        // custom code goes here!

        return temp;
    }

(я только что протестировал, и это работает: пользовательский код выполняется после ArrangeOverride любогодочерний элемент управления в окне)

EDIT: следует проверенному и рабочему примеру:

В window1.xaml.cs:

[...]
protected override Size ArrangeOverride(Size arrangeBounds)
{
    Trace.TraceInformation("Window1.ArrangeOverride START");
    Size temp = base.ArrangeOverride(arrangeBounds);
    Trace.TraceInformation("Window1.ArrangeOverride END");
    return temp;
}
[...]

В myUserControl.xaml.cs:

[...]
protected override Size ArrangeOverride(Size arrangeBounds)
{
    Trace.TraceInformation("{0}.ArrangeOverride START", Tag);
    Size s = base.ArrangeOverride(arrangeBounds);
    Trace.TraceInformation("{0}.ArrangeOverride END", Tag);
    return s;
}
[...]

В window1.xaml:

[...]
<local:myUserControl Tag="FirstLevelControl">
    <StackPanel>
        <local:myUserControl Tag="SecondLevelControl_1">
            <TextBlock>First</TextBlock>
        </local:myUserControl>
        <local:myUserControl Tag="SecondLevelControl_2">
            <TextBlock>Second</TextBlock>
        </local:myUserControl>
    </StackPanel>
</local:myUserControl>
[...]

И, наконец, вывод после выполнения:

[...]
Test.vshost.exe Information: 0 : Window1.ArrangeOverride START
Test.vshost.exe Information: 0 : FirstLevelControl.ArrangeOverride START
Test.vshost.exe Information: 0 : SecondLevelControl_1.ArrangeOverride START
Test.vshost.exe Information: 0 : SecondLevelControl_1.ArrangeOverride END
Test.vshost.exe Information: 0 : SecondLevelControl_2.ArrangeOverride START
Test.vshost.exe Information: 0 : SecondLevelControl_2.ArrangeOverride END
Test.vshost.exe Information: 0 : FirstLevelControl.ArrangeOverride END
Test.vshost.exe Information: 0 : Window1.ArrangeOverride END
[...]

Это демонстрирует, что строка кода междуtemp = base.ArrangeOverride и return temp всегда выполняются ПОСЛЕ всего кода во всех вложенных пользовательских элементах управления методом ArrangeOverride.Я не пытался отслеживать выполнение Arrange встроенных элементов управления, но я полагаю, что они ведут себя одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...