【问题标题】:Is it possible to Click a label control on WPF/WinForm App using Microsoft Automation UI是否可以使用 Microsoft 自动化 UI 在 WPF/WinForm 应用程序上单击标签控件
【发布时间】:2015-07-20 09:09:09
【问题描述】:

在我们的应用程序中,我们有一个可点击的标签,它会弹出另一个窗口。我一直在阅读 Microsoft 自动化 UI 文档,但找不到能够单击标签控件的方法。

我知道我不能使用调用模式,因为它只处理按钮控件。

以下是我们拥有的 XAML 中的代码

 <Label Name="LblCompleteOrdersCount" Content="{Binding CompleteOrders, Mode=OneWay}" Margin="434,45,0,0" Height="62" Width="170" Padding="0" HorizontalAlignment="Left" VerticalAlignment="Top" VerticalContentAlignment="Top" FontSize="56" FontWeight="Bold">
    <Label.InputBindings>
        <MouseBinding Command="{Binding Path=CompleteOrdersCommand}" MouseAction="LeftClick" />
    </Label.InputBindings>
 </Label>

【问题讨论】:

  • 是什么让你选择了 Label 而不是 Button?有什么特殊的功能权重有利于 Label?
  • @Maximus 标签用于显示我们拥有的完整订单的数量。我们的企业需要一种方法,让他们可以轻松查看完整订单的数量(以及每个订单的摘要),以便他们可以将这些订单导出到 Excel 表格中。
  • 而 Button 没有这个能力?
  • @Maximus 我们可以放一个按钮,但是我们需要标签来显示完成的订单数量。
  • 使用 then 按钮,覆盖默认模板并使其看起来像标签。如果 Label 仅提供 Button 但缺少 UI 测试支持,我认为没有必要乱来。

标签: c# wpf microsoft-ui-automation


【解决方案1】:

我的提示是使用按钮。它派生自 ICommandSource 接口,因此您可以毫不费力地使用 Command 将 Button 与处理程序相关联。问问自己:Label 提供了哪些 Button 没有的功能?更好看?覆盖默认按钮的模板,您将获得等效的外观。只要您不利用 Label 的任何附加功能,我认为没有任何意义。

【讨论】:

  • 这不适用于运行/部署的应用程序,此时更改设计超出范围。
【解决方案2】:

从我的角度来看,你有 3 个选项来解决这个问题:

  1. UI 自动化方法覆盖组件的 AutomationPeer 并在您的情况下返回 ButtonAutomationPeer。这里最大的优势是能够对所需的每个自定义行为进行建模。 Microsoft's docu进一步阅读
  2. 使用标签的 ClickablePoint,并将其与 User32.dll 组合(在提供的坐标上触发实际的鼠标点击)。 - 另见微软mouse_event function 更多详细信息的文档 - 此解决方案不需要对您的应用程序进行任何更改,但面临以下缺点:如果您不自己构建适当的子例程,您将无法同时自动化多个应用程序并且您必须注意将应用程序保持在前台(您可以使用来自 User32.dll 的ShowWindow function)。
  3. 正如 Maximus 已经建议的那样使用按钮并使其看起来像标签。我同意他的观点,在我们的案例中这应该是一个有效的解决方法。

【讨论】:

  • 选项 (1) 应该只在 WPF 中工作?你能给出或指出选项(2)的一个例子吗?
  • 您好,关于 (1) 我只将它用于 WPF,不确定如何处理 winforms -> 添加新的 SO 问题?关于(2)对不起,这些年来我提到了错误的.dll名称,编辑了我的帖子并为您添加了有关相关功能的微软文档链接..
猜你喜欢
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 2019-10-09
  • 2016-04-23
  • 1970-01-01
相关资源
最近更新 更多