ItemsControl如何记住它的焦点元素?

时间:2016-07-12 19:10:00

标签: wpf focus itemscontrol

考虑以下布局:

 <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>

关于键盘导航,这可以像您期望的那样工作:

  • 使用三个&lt; Tab&gt;,您可以从第一个按钮导航到itemscontrol,最后导航到第二个按钮。
  • 当Tabbing到ItemsControl时,您可以使用光标键导航包含的项目
  • 当删除ItemsControl并返回其中时,将恢复最后一个重点项目

现在,让我们将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默认行为。)

0 个答案:

没有答案