考虑以下布局:
<Button Grid.Row="0">Before</Button>
<ItemsControl x:Name="MainItemsControl"
Grid.Row="1"
KeyboardNavigation.TabNavigation="Once"
KeyboardNavigation.DirectionalNavigation="Contained"
IsTabStop="False">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True"
Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ListBoxItem>Test1</ListBoxItem>
<ListBoxItem>Test2</ListBoxItem>
<ListBoxItem>Test3</ListBoxItem>
</ItemsControl>
<Button Grid.Row="2">After</Button>
关于键盘导航,这可以像您期望的那样工作:
现在,让我们将ListBoxItems替换为另一个ItemsControls级别:
<ItemsControl x:Name="MainItemsControl"
[...]
<ItemsControl KeyboardNavigation.TabNavigation="Once"
KeyboardNavigation.DirectionalNavigation="Continue"
IsTabStop="False">
<ListBoxItem>One1</ListBoxItem>
<ListBoxItem>One2</ListBoxItem>
<ListBoxItem>One3</ListBoxItem>
</ItemsControl>
<ItemsControl KeyboardNavigation.TabNavigation="Once"
KeyboardNavigation.DirectionalNavigation="Continue"
IsTabStop="False">
<ListBoxItem>Two1</ListBoxItem>
<ListBoxItem>Two2</ListBoxItem>
<ListBoxItem>Two3</ListBoxItem>
</ItemsControl>
</ItemsControl>
总的来说,这仍然可以按预期工作。您现在可以使用左+右箭头键在“一”和“两”项之间导航。
然而,当我对一个“Two”项目进行聚焦,然后从ItemsControl中选择并返回到它时,最后选择的“One”项目的焦点(即最左侧内部ItemsControl的最后一个焦点)将被恢复。 / p>
什么样的机制导致ItemsControl记住它的内部焦点,为什么它在我添加另一层ItemsControls时会中断?
(注意:到目前为止还没有定义手动FocusScopes等。通过修改FocusManager,你可以让WPF恢复正确的焦点。我想知道vanilla默认行为。)