将点击发送到没有InvokePattern的AutomationElement

时间:2015-04-27 21:39:33

标签: c# wpf automation automationelement

使用AutomationElement,是否可以将点击发送到TabItem,而无需移动鼠标并模拟点击次数? AutomationElement对我来说还是新手 - 根据我的理解,除非它支持InvokePattern(TabItem不支持),否则你必须选择定位控制位置和模拟鼠标的路线。我有那个代码可以工作(见下文) - 我很好奇这是否是我的选择。

AutomationElement tabControl = GetControl(window, "NOTEBOOK");
AutomationElement tabGeneral = GetControl(tabControl, "FM_STAFF_SUB_P1");

AutomationElementCollection tabs = GetAllTabs(window, tabGeneral);

System.Windows.Point p = tabs[1].GetClickablePoint();

MoveMouse((int)p.X, (int)p.Y);
ClickMouse();

谢谢。

2 个答案:

答案 0 :(得分:1)

  1. 尝试tab.SetFocus()
  2. 获取所有支持的模式(tab.GetSupportedPatterns()),然后查看此选项卡实现支持哪些模式。它应该支持SelectionItemPattern,因此请使用:((SelectionItemPattern)tab.GetCurrentPattern(SelectionItemPattern.Pattern)).Select()
  3. 在窗口中使用SendKeys以浏览标签(大多数情况下都会有热键在它们之间导航。您可以在每次导航后检查是否选中了标签。
  4. 如果上述所有操作均失败,我猜鼠标是您唯一的选择。

答案 1 :(得分:1)

在向选项卡项添加热键时,我遇到了类似的问题。在我的情况下,仅选择选项卡项目将使其具有焦点,但在动态生成选项卡时不会显示其内容。除非我误解了您的问题,否则本示例将模拟使用TabItemAutomationPeer单击的选项卡项。

        //get the TabItem
      TabItem tabItem = (TabItem)sender; //or however you are getting it.
    
        //get the TabControl
      TabControl tabControl = UIHelper.FindLogicalParent<TabControl>(tabItem); //or however you are getting it.
      
        //do that magic
      tabItem.IsSelected = true; 
      TabControlAutomationPeer tabControlAutomationPeer = new TabControlAutomationPeer(tabControl);
      TabItemAutomationPeer tabItemAutomationPeer = new TabItemAutomationPeer(tabItem, tabControlAutomationPeer);
      tabItemAutomationPeer.SetFocus(); //works like a click