【问题标题】:When a control becomes invisible, how can I move focus to the next sibling instead of the parent?当控件变得不可见时,如何将焦点移到下一个兄弟而不是父控件?
【发布时间】:2016-01-12 20:19:52
【问题描述】:

在 WPF 中,默认情况下,当焦点控件变为不可见时,焦点将更改为下一个可焦点父容器。是否有一种通用的方法可以将焦点移到下一个可聚焦的同级控件?例如,给定这个人为的例子:

<StackPanel Focusable="True">
        <Button Height="30" Width="150" Click="Button_Click">First</Button>
        <Button Height="30" Width="150">Second</Button>
</StackPanel>

这个事件处理程序隐藏第一个按钮:

private void Button_Click(object sender, RoutedEventArgs e)
{
    ((Button) sender).Visibility = Visibility.Collapsed;
}

如果您切换到第一个按钮并按 Enter,则 StackPanel 将获得焦点。我希望第二个按钮获得焦点。

我希望有一个通用的解决方案(而不是通过后面的代码将焦点设置到特定元素),因为我的应用中有几个地方是键盘导航的问题。

【问题讨论】:

  • StackPanel 上的FocusManager.IsFocusScope 有这个效果吗?
  • 是的,它的作用相同。如果直接父级将IsFocusScope 设置为false,则WPF 似乎只是沿着树向上查找第一个可聚焦的父控件,然后将其聚焦。 (实际上,这些容器是用户控件或 ListBox,它们可以合法地获得焦点,而不是 StackPanel。)

标签: c# wpf xaml


【解决方案1】:

FocusManager.SetFocusedElementhttps://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.setfocusedelement(v=vs.110).aspx 可用于将逻辑焦点设置到特定元素。

FocusManager.SetFocusedElement(focusScope1, button2);

你需要有当前的焦点范围。

这可以通过 XAML 完成:

<Style x:Key="FocusButton" TargetType="StackPanel">
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=button1, Path=IsVisible}" Value="True">
            <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=button2}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

逻辑焦点和键盘焦点不一样——MSDN

【讨论】:

  • 这很有帮助。不幸的是,这不是我可以应用的理想“一般情况”设置,但这足以让我克服当前的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2022-12-11
  • 2017-05-08
相关资源
最近更新 更多