如何以编程方式导航 WPF UI 元素制表位?

Posted

技术标签:

【中文标题】如何以编程方式导航 WPF UI 元素制表位?【英文标题】:How to programmatically navigate WPF UI element tab stops? 【发布时间】:2010-10-23 00:04:16 【问题描述】:

谁能告诉我如何以编程方式浏览 WPF 应用程序中的所有 UI 元素制表位?我想从第一个制表位开始嗅探相应的元素,访问下一个制表位,嗅探相应的元素,依此类推,直到到达最后一个制表位。

谢谢, - 迈克

【问题讨论】:

【参考方案1】:

您可以使用 MoveFocus 执行此操作,如这篇 MSDN 文章中所示,该文章解释了有关焦点的所有内容:Focus Overview。

这里是一些示例代码,用于获取下一个焦点元素(从那篇文章中获得,稍作修改)。

// MoveFocus takes a TraversalRequest as its argument.
TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next);

// Gets the element with keyboard focus.
UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;

// Change keyboard focus.
if (elementWithFocus != null) 

    elementWithFocus.MoveFocus(request);

【讨论】:

【参考方案2】:

您可以使用 MoveFocus 调用来做到这一点。您可以通过 FocusManager 获取当前聚焦的项目。以下代码将迭代窗口中的所有对象并将它们添加到列表中。请注意,这将通过切换焦点来物理修改窗口。如果窗口不活动,很可能代码将无法工作。

// Select the first element in the window
this.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

TraversalRequest next = new TraversalRequest(FocusNavigationDirection.Next);
List<IInputElement> elements = new List<IInputElement>();

// Get the current element.
UIElement currentElement = FocusManager.GetFocusedElement(this) as UIElement;
while (currentElement != null)

    elements.Add(currentElement);

    // Get the next element.
    currentElement.MoveFocus(next);
    currentElement = FocusManager.GetFocusedElement(this) as UIElement;

    // If we looped (If that is possible), exit.
    if (elements[0] == currentElement)
        break;

【讨论】:

以上代码在我的 WPF 窗口中不起作用。该列表最终为空。上面的第一个 GetFocusedElement() 调用返回 null。我同意此代码与文档完全匹配,但不幸的是它对我不起作用。我正在寻找原因。 你在哪里调用代码?请注意,窗口必须处于活动状态,因此构造函数肯定不在。 OnLoad 可能会起作用,我使用的是 Activated,每次激活窗口时都会调用它。

以上是关于如何以编程方式导航 WPF UI 元素制表位?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式为 Kendo Ui 调度程序调用导航事件

如何访问 Xamarin.Forms 中以编程方式创建的 UI 元素:timepicker

如何在android中以编程方式在片段之间导航?

如何在不“连接”它们的情况下以编程方式访问 NIB 中的 UI 元素?

WPF:如何以编程方式从 TextBox 中移除焦点

如何以编程方式调用 jQuery UI Draggable 拖动开始?