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あります。dataGridDataGrid

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 に制限されている場合は、カスタム コントロールに対して次の 5 つの手順も実装していることを確認する必要があります (詳細については、このドキュメントを参照してください)。

  1. OnCreateAutomationPeer をオーバーライドして、コントロールを UIA に公開します。
  2. Core メソッドをオーバーライドして、正しいプロパティ値を提供する
  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

オーバーライドは正しいようです。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);
}

また、UserControl 内でオーバーライドする場合はOnCreateAutomationPeertoolkit:DataGridToolkit:DataGrid を UserControl 内で使用する CustomControl としてサブクラス化する必要があります。

于 2012-10-25T08:01:56.880 に答える