这个问题中嵌入了一些需要解决的问题。
首先是RoutedEvent
会向外传播并向上传播视觉树。因此,如果你已经嵌入控件中的控件像这样...
<Grid Name="MyGrid">
<StackPanel>
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>
<TextBlock>Button 3</TextBlock>
</Button>
</StackPanel>
</Grid>
...附加一个事件来处理MyGrid
KeyDown
行为;将从其子女内接收任何KeyDown
RoutedEvent
。
有一个警告,如果该事件被标记为由视觉树内的控件处理,这将是Button
控件和MouseLeftButtonDown
RoutedEvent的情况;那么你需要调整你的注册方式。这很简单,可以这样做;其中true
表明即使另一个处理程序标记事件处理,也希望通知您。
public Window1()
{
InitializeComponent();
MyGrid.AddHandler(UIElement.MouseLeftButtonDownEvent, new RoutedEventHandler(MouseLeftButtonDown), true);
}
private void MouseLeftButtonDown(object sender, RoutedEventArgs e)
{
Console.WriteLine("MouseLeftButtonDown Fired");
}
如果你用调试器来逐步通过你会看到的RoutedEvent的,当你点击文本按钮3源确实是TextBlock
。
这将解决您需要挂钩到不同的控件;因为您可以利用变化的RoutedEvents
。
焦点仍然必须存在于应用程序的某个地方,可以通过父控制轻松设置并调用Focus
。