Дочерние расширители, поднимающие развернутые и свернутые события родительского расширителя? - PullRequest
6 голосов
/ 18 мая 2011

По какой-то причине дочерние Expander s (помещенные в StackPanel внутри другого Expander), когда они свернуты или развернуты, заставляют родительский Expander вызывать свои события Expanded или Collapsed.

Кто-нибудь знает, почему это или как я могу это изменить? Меня интересуют только события родителей.

Вот несколько тестов XAML:

    <Expander Header="Outer" Expanded="Expander_Expanded" Collapsed="Expander_Collapsed">
        <StackPanel>
            <Expander Header="Inner1">
                <Canvas Height="100" Width="100" Background="Blue" />
            </Expander>
            <Expander Header="Inner2">
                <Canvas Height="100" Width="100" Background="Red" />
            </Expander>
        </StackPanel>
    </Expander>

и вот код:

    private void Expander_Expanded(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("expanded");
    }

    private void Expander_Collapsed(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("collapsed");
    }

Когда вы запускаете это, если вы расширяете родителя, вы получаете «расширенное» окно сообщения, как и следовало ожидать. Но когда вы расширяете одно из дочерних элементов, вы снова получаете окно сообщения.

Документация для расширенного события гласит:

Событие Expanded наступает, когда свойство IsExpanded изменяется с false на true

Но очевидно, что свойство IsExpanded не изменяется в родительском Expander.

Почему это происходит, есть идеи?

1 Ответ

12 голосов
/ 18 мая 2011

Эти события маршрутизируются и всплывают в дереве, если вы хотите, чтобы родители не смогли обработать событие и таким образом отреагировать на него, установите e.Handled в true в обработчике событий дочернего расширителя.

Редактировать: Вместо того, чтобы предотвращать возникновение события, вы также можете просто ограничить выполнение кода в обработчике случаем, когда фактический расширитель, к которому прикреплен обработчик, вызвал событие. Вы можете сделать это, поместив все в if -блок, который выполняется, если sender == e.OriginalSource.


( Ву, 10к ... )

...