這個問題中嵌入了一些需要解決的問題。
首先是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
。