3

我有一个大型 WPF 应用程序,其中在用户控件中有一个数据网格,我需要为 OnCreateAutomationPeer 创建一个覆盖。我在这样做时遇到了麻烦,而且该事件似乎永远不会触发。在我的代码隐藏中,我有类似的东西

public partial class DocChecklistView :  UserControl, IDataModuleView {     

        protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
        {                
            return null;
        }

        public CDocumentChecklistView() {
            InitializeComponent();
        }
}

XAML 是非常标准的代码,例如

<UserControl>
 <Grid>
        <toolkit:DataGrid  ItemsSource="{Binding Source={StaticResource DocumentsVS}}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False"
                FontSize="16" Name="_dgDocuments" Style="{StaticResource EklektosDataGridStyle}" . . . >
</UserControl>

在上面,toolkit:DataGrid设置为 WPFToolkit 的命名空间。按设计DataGrid工作,我从未在用户控件中进行过覆盖,并且我上面的代码从未触发 - 从未达到断点。

有什么想法吗?

4

3 回答 3

7

您已正确覆盖该方法。如果你想覆盖OnCreateAutomationPeer你的dataGrid,你必须继承DataGrid-

public class MyDataGrid : DataGrid
{
    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return null;
    }
}

在 xaml 中,使用您的自定义 dataGrid

<local:MyDataGrid x:Name="dataGrid"/>

在您的 UserControl 的构造函数中 -

public CDocumentChecklistView()
{
    InitializeComponent();
    AutomationPeer a = UIElementAutomationPeer.CreatePeerForElement(dataGrid);
}

你需要要求AutomationPeer打断点。不就是你想要的吗?

这就是您所缺少的-UIElementAutomationPeer.CreatePeerForElement(dataGrid);

于 2012-10-27T15:13:32.890 回答
2

您需要在自定义控件中覆盖该OnCreateAutomationPeer方法DataGrid,如下所示:

public partial class MyDataGrid : DataGrid
{
    protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
    {
        return null;
    }
}

然后将其添加到您的 UserControl 中,如下所示(只需在构建项目后使用 Visual Studio 拖放):

<UserControl xmlns:YourApplicationNamespace="clr-namespace:YourApplicationNamespace"  x:Class="YourApplicationNamespace.DocChecklistView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Margin="0,1,0,-1">
        <YourApplicationNamespace:MyDataGrid x:Name="myDataGrid1" />  
    </Grid>
</UserControl>

您指定需要覆盖 OnCreateAutomationPeer 方法。仅当您的应用程序使用 UIA(UI 自动化),并且如果应用程序的该部分受 UIA 约束(据我所知)时,才需要这样做。如果没有,那么您甚至不需要重写 OnCreateAutomationPeer 方法。但是,如果您的应用程序的所有功能都仅限于 UIA,那么您需要确保您还为您的自定义控件实现了以下五个步骤(请阅读此文档以获取更多信息):

  1. 通过覆盖 OnCreateAutomationPeer 向 UIA 公开控件
  2. 通过覆盖核心方法提供正确的属性值
  3. 使客户端能够使用方法与控件进行交互
  4. 实施模式提供者
  5. 引发事件

如果您想获取控件的自动化对等对象(您可以使用此对象来获取有关控件特性和功能的信息并模拟交互使用),您可以在使用 FromElement 方法创建它后获取它,如果不是,您可以使用 CreatePeerForElement 方法。

AutomationPeer automationPeer = UIElementAutomationPeer.CreatePeerForElement(checklistView.myDataGrid1);
            automationPeer = UIElementAutomationPeer.FromElement(checklistView.myDataGrid1);

无论您使用何种 UIA 方法(测试代码或构建提供辅助功能或其他功能的应用程序),您都需要确保已为自定义控件制定了支持 UIA 的要求,并且已创建 AutomationPeer 对象,以便自动化代码可以使用它来获取有关控件特性和功能的信息或模拟交互使用。

于 2012-10-31T17:00:52.797 回答
1

Override 似乎是正确的,您只需要创建一个AutomationPeer才能获得断点:

XAML:

<local:DocChecklistView x:Name="DocChecklistView" Initialized="DocChecklistView_Initialized"/>

在上面的 XAML 的 CodeBehind 中:

private void DocChecklistView_Initialized(object sender, EventArgs e)
{
   var peer = UIElementAutomationPeer.CreatePeerForElement(DocChecklistView);
}

如果您想覆盖您OnCreateAutomationPeertoolkit:DataGridUserControl 内部,您必须将 toolkit:DataGrid 子类化为您在 UserControl 内部使用的 CustomControl

于 2012-10-25T08:01:56.880 回答