1

MDI の各子のメイン コンテンツとして ElementHost コントロールを介して WPF ベースの UserControls をホストしていることを除いて、従来の MDI 実装を含む WinForms ベースのアプリがあります。これは、残念ながらさまざまな副作用がありますが、WPF で MDI を実現するために Microsoft が推奨するソリューションです。その 1 つは、Tab キーが WPF コントロールによって飲み込まれているように見えるため、各 MDI 子の間でタブを切り替えるための Ctrl+Tab 機能がなくなったことです。

組み込みのタブ切り替え機能を取得できるように、Ctrl+tab キー シーケンスが WinForms MDI 親に到達できるようにする簡単な解決策はありますか?

4

1 に答える 1

1

ホスト WinForm で、Ctrl-(Shift)-Tab をキャプチャし、次または前の MDI 子をアクティブ化し、イベントを処理済みとしてマークする、ホストされた WPF コントロールの PreviewKeyDown ハンドラーを追加します。

TheHostedWpfControl.PreviewKeyDown += (s, e) =>
{
    if (e.Key == Key.Tab && ModifierKeys.HasFlag(Keys.Control))
    {
        ActivateNextMdiChild(ModifierKeys.HasFlag(Keys.Shift));
        e.Handled = true;
    }
};

次/前の MDI 子のアクティブ化は次のとおりです。

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, int lParam);

private const int WM_MDINEXT = 0x224;

private void ActivateNextMdiChild(bool backward = false)
{
    if (MdiParent != null)
    {
        MdiClient mdiClient = MdiParent.Controls.OfType<MdiClient>().FirstOrDefault();
        if (mdiClient != null)
        {
            SendMessage(mdiClient.Handle, WM_MDINEXT, Handle, backward ? 1 : 0);
        }
    }
}
于 2011-02-03T19:23:42.603 に答える