在我的Windows 8 Metro项目中,我正在使用从ContentControl派生的类(让我们称之为MyControl)来呈现我的内容。在MyControl里面我有一个ScrollViewer。因为我希望我的控件能够处理键盘事件,所以我需要能够将焦点设置为我的控件。但是,我还想让滚动查看器处理键事件,例如箭头键和PageUp / Down。更确切地说,我希望这是另一个程序员可以打开或关闭的选项。这意味着有时候,我希望MyControl成为一个制表位,有时候我希望ScrollViewer成为一个制表位,但绝不会两者兼而有之。
问题是我不想将MyControl的内部工作暴露给其他程序员。也就是说,理想情况下,它们应该能够使用MyControl.IsTabStop并保留使用我的Control放置实际制表位的逻辑(放入MyControl或ScrollViewer)。
有没有什么好方法可以达到这个目的,还是我不得不通过提供一个独立的功能让我的控件成为制表位来解决它?
答案 0 :(得分:0)
如果你看看我的测试XAML,你会看到我什么也没做,但是TextBox中的上/下键可以在文本行之间进行操作,当没有任何文本行时它们会滚动ScrollViewer至。这可能是由KeyDown处理程序设置e.Handled值为true时实现的,因为它们不希望键事件冒泡(如TextBox已经处理它)并且在未处理事件时将其保留为false,这使得ScrollViewer处理它。如果TextBox具有焦点,则该事件将始终在TextBox上触发,但如果未处理,则它会在可视树中冒泡。除了决定是否要将关键事件标记为已处理之外,您似乎不必做任何其他事情。
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<ScrollViewer
IsTabStop="True">
<Grid
Width="2000"
Height="2000">
<Button
Margin="149,342,0,311">
<Button>
<TextBox
AcceptsReturn="True"
Height="400"
Width="200"/></Button>
</Button>
</Grid>
</ScrollViewer>
</Grid>