WPF имеет новую архитектуру событий, которая может вам здесь помочь. Так называемые «перенаправленные» события могут либо «туннелировать» от логического корневого контейнера через все промежуточные контейнеры к элементу-источнику события, либо «пузыриться» от исходного элемента (т. Е. События «туннелирования» и «всплытия» распространяются в противоположных направления).
Все это говорит о том, что вы обычно можете перехватывать события от дочерних элементов, регистрируя обработчик событий в контейнере. Вот пример перехвата событий нажатия кнопок от кнопок в StackPanel:
<StackPanel ButtonBase.Click="HandleButtonClick">
<Button>Foo</Button>
<Button>Bar</Button>
</StackPanel>
И HandleButtonClick
может быть реализовано так:
private void HandleButtonClick(object sender, RoutedEventArgs e)
{
var button = e.OriginalSource as Button;
if (button != null) MessageBox.Show(button.Content.ToString());
}
В зависимости от того, какой тип «пользовательских элементов управления» вы используете, это может быть невозможно. Это потому, что не все события являются «перенаправленными» событиями. Управляющие события WPF обычно перенаправленные события.