是否可以使用Microsoft Automation UI单击WPF/WinForm应用程序上的标签控件

Chr*_*lan 6 c# wpf microsoft-ui-automation

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

我知道我不能使用Invoke模式,因为它只处理Button控件.

以下是我们拥有的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>
Run Code Online (Sandbox Code Playgroud)

Max*_*mus 6

我的提示是使用Button.它派生自ICommandSource接口,因此您可以毫不费力地使用Command将Button与处理程序相关联.问问自己:Label提供的Button功能不是什么功能?好看?覆盖默认按钮的模板,您将获得相同的外观.只要您不利用Label的任何其他功能,我就会发现没有必要弄乱它.


Han*_*nsa 5

从我的角度来看,您有 3 个选项可以解决此问题:

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