0

アプリケーションで Windows イベントを処理する必要がありWPFます。そのために、次のようにセットアップprojectName_SourceInitializedしました。

private void FieldPlannerWnd_SourceInitialized(object sender, EventArgs e)
{
    IntPtr windowHandle = (new WindowInteropHelper(Application.Current.MainWindow)).Handle;
    HwndSource src = HwndSource.FromHwnd(windowHandle);
    src.AddHook(new HwndSourceHook(WndProc));
}

このために、WndProc関数は同じクラス (MainWindowクラス) にある必要があります。my が処理しようとしているメッセージは、WndProc基本的にこのクラスに Lparam と Wparam で POINT を送信するレガシー コードからのものです。その POINT を、このクラスのデータ コンテキストとして設定されている USER CONTROL のクラスと共有する必要がありますMainWindow。これは私のWndProc手順がどのように見えるかです:

private IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    switch (msg)
    {
        case WM_POINTDATASENT:
        //gm.GAInfo = new GAInfo();
        PointsVector pt = new PointsVector();
        pt.X = wParam.ToInt32();
        pt.Y = lParam.ToInt32();
        //WellGeometriesView.FirstSlotLocation = pt;
        //WellGeometriesViewModel.FirstSlotLocation = pt;
        //gm.GetCoordinates(wParam, lParam);

        break;
     }

    return IntPtr.Zero;
}

メイン ウィンドウのクラスに USER Control のクラスのメンバー変数を含めることができないため、WndProc で受信したこの POINT データを UserControl のクラスと共有するにはどうすればよいですか? 考えられる 1 つの方法は、ユーザー コントロールのクラスに WndProc イベント ハンドラーを追加することでしたが、そのクラスには _SourceInitialized イベント ハンドラーが含まれていません。どうやってやるの?他に良い方法はありますか?

PS : USER CONTROLS のクラスのすべてのメンバーは非静的であり、MVVM 構造に従おうとしています。

4

1 に答える 1

1

ポイント データを Window の DataContext に配置し、UserControl がバインディングまたはコード (parent.DataContext) によって親からデータをプルするようにします。

于 2013-06-10T10:23:37.463 に答える