能否使用Microsoft Automation UI在WPF/WinForm应用程序中单击标签控件?

8

我们的应用程序中有一个可点击的标签,它会弹出另一个窗口。我已经阅读了Microsoft Automation UI文档,但没有找到一种方法可以点击标签控件。

我知道我不能使用Invoke Pattern,因为它只处理按钮控件。

以下是我们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
@Maximus 标签用于显示我们拥有的完成订单数量。我们的业务需要一种简单的方式来查看完成订单的数量(以及每个订单的摘要),以便他们可以将这些订单导出到 Excel 表格中。 - ChrisMcLellan
按钮不具备这个功能吗? - Maximus
@Maximus 我们可以放一个按钮,但是我们需要标签显示已完成订单的数量。 - ChrisMcLellan
3
使用按钮(Button),覆盖默认模板并使其看起来像标签(Label)。如果标签提供的内容与按钮相同,但缺乏UI测试支持,那么我认为没有必要再费周折。 - Maximus
2个回答

6

我的建议是使用按钮。它派生自ICommandSource接口,因此您可以轻松地使用命令将按钮与处理程序关联起来。问问自己:标签提供了哪些功能,按钮没有提供?更好的外观?覆盖默认按钮的模板,您将获得等效的外观。只要您不利用标签的任何其他功能,我认为没有必要去研究它。


这不是针对正在运行/部署的应用程序的答案,目前更改设计不在考虑范围内。 - Veverke

5
我认为您有三种解决这个问题的选择:
  1. UI自动化方法覆盖您组件的AutomationPeer 并在您的情况下返回ButtonAutomationPeer。 这里的最大优势是能够模拟所需的任何自定义行为。 请参阅 Microsoft文档以获取更多信息。
  2. 使用您的Label的 ClickablePoint ,并与User32.dll 结合使用(在提供的坐标上触发实际鼠标单击)。 另请参阅微软mouse_event函数文档以了解更多详细信息。该解决方案不需要对您的应用程序进行任何更改,但面临以下缺点:如果您不构建正确的子例程,则无法同时自动化多个应用程序,并且您必须注意保持应用程序处于前台(您可以使用User32.dll中的ShowWindow函数来实现)。
  3. 如Maximus已经建议的,使用Button并使其看起来像Label。我同意他的观点,这应该是我们案例中有效的解决方法。

选项(1)只能在WPF中使用?您能否提供或指向选项(2)的示例? - Veverke
1
你好,关于(1),我只在WPF中使用过这个,不确定winforms该怎么做 -> 添加一个新的SO问题?关于(2),很抱歉,这些年来我一直引用错误的.dll名称,在我的帖子中进行了编辑,并为您添加了有关相关功能的微软文档链接。 - Haphil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接