Как я могу установить событие клика для дочернего элемента меню без создания родительского события? - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть этот код:

<Menu IsMainMenu="True">
    <MenuItem Header="Parent" Click="ParentItem_Click" >
        <MenuItem Header="Child" Click="ChildItem_Click">
        </MenuItem>
    </MenuItem>
</Menu>

Когда я щелкаю дочерний MenuItem, родительский MenuItem также поднимается. Я не хочу, чтобы это родительское событие было возбуждено.

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

Это стандартное поведение для событий со стратегией маршрутизации Bubbling. Вы можете вручную установить eventArgs.Handled = true в обработчике событий. См. Пометка перенаправленных событий как обработанных и Классовая обработка

Учитывая, что событие Click не связано с событием туннелирования, таким как PreviewClick - вы можете попробовать использовать PreviewMouseDown PreviewMouseUp события туннелирования и посмотреть, можете ли вы присоединить свою логику на эти события.

Стратегии перенаправленных событий :

Bubbling : Вызываются обработчики событий в источнике событий. Затем перенаправленное событие направляется к последовательным родительским элементам до достижения корень дерева элементов. Большинство маршрутизируемых событий используют пузырчатую маршрутизацию стратегия. Пузырьковые перенаправленные события обычно используются для сообщения о входе или изменения состояния от отдельных элементов управления или других элементов пользовательского интерфейса.

Direct : только самому исходному элементу предоставляется возможность вызывать обработчики в ответ. Это аналогично "маршрутизации" Windows Forms использует для событий. Однако, в отличие от стандартного события CLR, прямая маршрутизация событий поддерживает обработку классов (обработка классов объяснено в следующем разделе) и может использоваться EventSetter и EventTrigger.

Туннелирование : Изначально вызывались обработчики событий в корне дерева элементов. Затем перенаправленное событие проходит маршрут через последовательный дочерние элементы вдоль маршрута, к элементу узла, который является источник перенаправленного события (элемент, вызвавший перенаправленное событие). Туннелирование перенаправленных событий часто используется или обрабатывается как часть составление для элемента управления, так что события из составных частей могут быть преднамеренно подавленными или замененными событиями, которые являются специфическими для полный контроль. Входные события, представленные в WPF, часто приходят реализован как пара туннелирования / пузыря. Туннельные события также иногда упоминается как Предварительный просмотр событий из-за именования соглашение, которое используется для пар.

3 голосов
/ 28 февраля 2012

При перенаправлении клика вы можете использовать этот код

private void OnYourMenuItemClicked(object sender, RoutedEventArgs e){
     MenuItem item = e.OriginalSource as MenuItem;
     if(null != item)
     {
         // Handle needed menu item click here
     }

}

0 голосов
/ 19 октября 2016

Я знаю, что это 4 с половиной года, но решение было довольно простым (я только что понял).Просто дайте названия предметам.

XAML

<Menu IsMainMenu="True">
    <MenuItem x:Name="Parent" Header="Parent" Click="ParentItem_Click" >
        <MenuItem x:Name="Child" Header="Child" Click="ChildItem_Click">
        </MenuItem>
    </MenuItem>
</Menu>

КОД

private void ParentItem_Click(object sender, RoutedEventArgs e)
{
     MenuItem item = e.OriginalSource as MenuItem;
     if(item == Parent)
     {
         // Handle Parent
     }
}

private void ChildItem_Click(object sender, RoutedEventArgs e)
{
     MenuItem item = e.OriginalSource as MenuItem;
     if(item == Child)
     {
         // Handle Child
     }
}

Надеюсь, это кому-нибудь поможет!

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