web-dev-qa-db-ja.com

WPF:ページにモーダルなポップアップウィンドウを表示する最良の方法は?

Windowsではなくナビゲーションスタイルのページを使用してWPFアプリを構築しています。ページ内にウィンドウを表示したいのですが、このウィンドウはページに対してモーダルである必要がありますが、ユーザーは他のページに移動して、同じ状態のモーダルウィンドウで同じページに戻ることができます。

WPFポップアップコントロールを試してみましたが、問題は、ページから移動するたびにコントロールが非表示になることです。もう一度表示するコードを書くことはできると思いますが、正しい方法で継ぎ目がありません。

WPFでこれを行うための最良の方法は何ですか?

16
Eduardo Molteni

これ StackOverflow回答 あなたの途中であなたを助けるかもしれません。他のユーザーが要求したサンプルコードをいくつか作成しました。これをブログ投稿に追加しました ここ

お役に立てれば!

18
Brad Leach

ネストされたメッセージポンプを使用してモーダルコントロールを作成しないのはなぜですか

http://www.deanchalk.com/wpf-modal-controls-via-dispatcherframe-nested-message-pumps/

5
Dean Chalk

Adornerレイヤーを使用して他のすべての上に自分自身を置くポップアップクラスを作成できます。

IsOpenというプロパティを持つポップアップの基本クラスを作成し、それが変更されたら、コントロールの可視性を適切な値に設定します。

ポップアップの下にあるコントロールのクリックを停止するには、ポップアップをページのフルサイズにすることができます。ポップアップが表示される実際の中央を除いて、ほとんど透明になります。ポップアップに対して完全に透過的なexecptにしたい場合は、ポップアップのHitTestCoreをオーバーライドする必要があります。

このようなもの:

protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
    // We want this control to behaive as a single rectangle and we don't much care
    // whether or it has a solid background.  So we override this method so we can have    // mouse over info for the entire panel regardless of background.

    // run the base hit test first, because if it finds something we don't want to overrule it.
    HitTestResult result = base.HitTestCore(hitTestParameters);


    // If we didn't get a hit generate a new hit test result, because HitTestCore is never called unless
    // the mouse is over the controls bounding rectangle.
    if (result == null)
        result = new PointHitTestResult(this, hitTestParameters.HitPoint);

    return result;
}

これがあなたを正しい方向に向けることができることを願っています。

3
Caleb Vear

Windowsはあなたがそうすることを好まない-それはWPFのことではない。上にあるパネルを使用し、visibleまたはzorderプロパティを使用します。

ウィキペディア 良い議論があります。

1
dkretz