【问题标题】:c# UI Automation labelc# UI自动化标签
【发布时间】:2011-08-20 17:30:57
【问题描述】:

我使用 Microsoft 的 UI 自动化库已经有一段时间了,我已经能够操作文本框和按钮。但是,我对某些控件有问题。

我有一个想要自动化的程序,它有一个图片框和一个链接标签,其功能类似于单击按钮。这意味着如果我点击图片框或链接标签,我将触发一个事件,并被引导到另一个页面。

我曾尝试使用按钮具有的调用方法,但不成功。有没有其他方法可以触发图片框或链接标签的点击事件或类似事件?

提前致谢。

微软的 UI 自动化库:http://msdn.microsoft.com/en-us/library/ms747327.aspx

【问题讨论】:

    标签: c# ui-automation


    【解决方案1】:

    按钮有一个PerformClick() 方法。

    【讨论】:

    • 该问题要求在标签上提供解决方案,而不是在按钮上。
    • 也许我们中的一个人误解了这个问题:“有没有其他方法可以触发点击事件...?”我的回答指出了按钮上的一种方法,可以通过编程方式调用。
    • 问题引用继续以“... 对于图片框或链接标签”?因此,可用于按钮的方法无济于事。据我了解的问题和答案:) 顺便说一句,我在这篇文章中结束了,因为我正在寻找标签的解决方案......
    【解决方案2】:

    > - 这听起来像是一个图片或标签控件,它只是传递鼠标按下事件,但不会让系统知道它的行为就像一个按钮。在这种情况下,最好的办法是使用 UIAutomation 获取边界矩形,然后使用 SendInput 将鼠标移动到那里并自己执行单击。

    UIAutomation 只知道如何处理标准按钮。任何基本上是自定义按钮的东西 - 例如。处理鼠标按下的标签 - 需要添加对一些额外接口的支持,以便告诉 UIAutomation 它可以被单击并为 Click 方法本身提供支持。

    【讨论】:

      【解决方案3】:

      可以更改 Winforms 控件在 UI 自动化方面的行为。如果您希望 UI 自动化将 PictureBox 视为一个按钮,因此可以使用 UI 自动化工具进行点击,您可以从 PictureBox 派生并覆盖自动化/可访问方法,如下所示:

      之前:

      public partial class Form1 : Form
      {
          public Form1()
          {
              InitializeComponent();
      
              var pb = new PictureBox();
              pb.Dock = DockStyle.Fill;
              pb.Click += (s, e) => MessageBox.Show("hello world");
              Controls.Add(pb);
          }
      }
      

      这就是 Inspect(来自 SDK 工具)将其视为“窗格”的方式,没有具体操作:

      之后:

      public partial class Form1 : Form
      {
          public Form1()
          {
              InitializeComponent();
      
              var pb = new ButtonPictureBox();
              pb.Dock = DockStyle.Fill;
              pb.Click += (s, e) => MessageBox.Show("hello world");
              Controls.Add(pb);
          }
      }
      
      public class ButtonPictureBox : PictureBox
      {
          protected override AccessibleObject CreateAccessibilityInstance() => new Accessible(this);
      
          private class Accessible : ButtonBase.ButtonBaseAccessibleObject
          {
              public Accessible(ButtonPictureBox control)
                  : base(control)
              {
              }
      
              public new ButtonPictureBox Owner => (ButtonPictureBox)base.Owner;
              public override AccessibleRole Role => AccessibleRole.PushButton;
              public override AccessibleStates State => AccessibleStates.Default;
              public override void DoDefaultAction() => Owner.OnClick(EventArgs.Empty);
          }
      }
      

      现在,Inspect 将其视为“按钮”,并且 Invoke Pattern 可用,因此如果您调用它,则会引发 Click 方法:

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 2020-09-13
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        • 2020-12-12
        • 1970-01-01
        • 2020-03-27
        • 2018-11-17
        相关资源
        最近更新 更多