0

在我的 Windows 8 Metro 项目中,我使用从 ContentControl 派生的类(我们称之为 MyControl)来展示我的内容。在 MyControl 中,我有一个 ScrollViewer。因为我希望我的控件能够处理键盘事件,所以我需要能够将焦点设置到我的控件上。但是,我还想要让滚动查看器处理键事件的选项,例如箭头键和 PageUp/Down。更准确地说,我希望这是另一个程序员可以打开或关闭的选项。这意味着有时,我希望 MyControl 成为一个制表位,有时我希望 ScrollViewer 成为一个制表位,但从不两者兼而有之。

问题是我不想将 MyControl 的内部工作原理暴露给其他程序员。也就是说,理想情况下,他们应该能够使用 MyControl.IsTabStop 并保留将实际制表位放置在我的 Control 中的逻辑(放入 MyControl 或 ScrollViewer)。

有没有什么好的方法来实现这一点,或者我是否必须通过提供一个单独的函数来解决它以使我的控件成为制表位?

4

1 回答 1

0

如果您查看我的测试 XAML,您会发现我什么也没做,但是 TextBox 中的向上/向下键可以在文本行之间移动,并且当没有文本行可以转到时,它们会滚动 ScrollViewer。这可能是通过 KeyDown 处理程序在不希望键事件冒泡时将 e.Handled 值设置为 true 来实现的(就像 TextBox 已经处理它时一样)并在未处理事件时将其设置为 false ,这让ScrollViewer 处理它。如果有焦点,该事件将始终在 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>
于 2012-11-16T18:59:27.770 回答