3

モーダル動作を持つカスタムポップアップを作成したいWPFアプリケーションがあります。「DoEvents」に相当するものを使用してソリューションをハックすることができましたが、これを行うためのより良い方法はありますか?これが私が現在持っているものです:

    private void ShowModalHost(FrameworkElement element)
    {
        //Create new modal host
        var host = new ModalHost(element);

        //Lock out UI with blur
        WindowSurface.Effect = new BlurEffect();
        ModalSurface.IsHitTestVisible = true;

        //Display control in modal surface
        ModalSurface.Children.Add(host);

        //Block until ModalHost is done
        while (ModalSurface.IsHitTestVisible)
        {
            DoEvents();
        }
    }

    private void DoEvents()
    {
        var frame = new DispatcherFrame();
        Dispatcher.BeginInvoke(DispatcherPriority.Background,
            new DispatcherOperationCallback(ExitFrame), frame);
        Dispatcher.PushFrame(frame);            
    }

    private object ExitFrame(object f)
    {
        ((DispatcherFrame)f).Continue = false;

        return null;
    }

    public void CloseModal()
    {
        //Remove any controls from the modal surface and make UI available again
        ModalSurface.Children.Clear();
        ModalSurface.IsHitTestVisible = false;
        WindowSurface.Effect = null;
    }

私のModalHostは、アニメーションやその他のサポートを備えた別の要素をホストするように設計されたユーザーコントロールです。

4

1 に答える 1

2

このデザインを考え直すことをお勧めします。

「DoEvents」を使用すると、コードの実行を許可し、同時にブロックしようとするため、特定の状況で非常に奇妙な動作を引き起こす可能性があります。

ポップアップを使用する代わりに、 ShowDialogでウィンドウを使用することを検討し、適切にスタイルを設定することができます。これは、モーダル動作を実装するための「標準」の方法であり、WPFを使用すると、ウィンドウをポップアップのように非常に簡単にスタイル設定できます...

于 2010-03-27T18:44:09.503 に答える