web-dev-qa-db-ja.com

WPFアプリケーションでページのモーダルダイアログを作成するにはどうすればよいですか?

他のコントロールの中でフレームをホストするWPFウィンドウがあります。そのフレームでは、さまざまなページを表示します。ダイアログをページのみにモーダルにする方法はありますか?ダイアログを表示しているときは、ページ上のコントロールをクリックすることはできませんが、ページ上にない同じウィンドウ上のコントロールをクリックすることはできます。

25
Robert Höglund

私があなたのメッセージを正しく解釈するのであれば、あなたは Billy Hollisが彼のStaffLynxアプリケーションで示している と同じように機能するものが必要です。

最近、同様のコントロールを作成しましたが、この種のアイデアはWPFで比較的簡単に実装できることがわかりました。 DialogPresenterというカスタムコントロールを作成しました。カスタムコントロールのコントロールテンプレートに、次のようなマークアップを追加しました。

_<ControlTemplate TargetType="{x:Type local=DialogPresenter}">
  <Grid>
    <ContentControl>
      <ContentPresenter />
    </ContentControl>
    <!-- The Rectangle is what simulates the modality -->
    <Rectangle x:Name="Overlay" Visibility="Collapsed" Opacity="0.4" Fill="LightGrey" />
    <Grid x:Name="Dialog" Visibility="Collapsed">
      <!-- The template for the dialog goes here (borders and such...) -->
      <ContentPresenter x:Name="PART_DialogView" />
    </Grid>
  </Grid>
  <ControlTemplate.Triggers>
    <!-- Triggers to change the visibility of the PART_DialogView and Overlay -->
  </ControlTemplate.Triggers>
</ControlTemplate>
_

また、「PART_DialogView」を検索するShow(Control view)メソッドを追加し、渡されたビューをContentプロパティに追加しました。

これにより、次のようにDialogPresenterを使用できるようになります。

_<controls:DialogPresenter x:Name="DialogPresenter">
  <!-- Normal parent view content here -->
  <TextBlock>Hello World</TextBlock>
  <Button>Click Me!</Button>
</controls:DialogPresenter>
_

ボタンのイベントハンドラー(またはバインドされたコマンド)に対して、DialogPresenterのShow()メソッドを呼び出すだけです。

また、ScaleTransformマークアップをDialogPresenterテンプレートに簡単に追加して、ビデオに表示されるスケーリング効果を取得することもできます。このソリューションには、きちんと整理されたカスタム制御コードと、UIプログラミングチーム向けの非常にシンプルなインターフェイスがあります。

お役に立てれば!

25
Brad Leach

github にプロジェクトがあります。これは、プライマリコンテンツの上にモーダルコンテンツを表示できるカスタムFrameworkElementです。

コントロールは次のように使用できます。

<c:ModalContentPresenter IsModal="{Binding DialogIsVisible}">
    <TabControl Margin="5">
            <Button Margin="55"
                    Padding="10"
                    Command="{Binding ShowModalContentCommand}">
                This is the primary Content
            </Button>
        </TabItem>
    </TabControl>

    <c:ModalContentPresenter.ModalContent>
        <Button Margin="75"
                Padding="50"
                Command="{Binding HideModalContentCommand}">
            This is the modal content
        </Button>
    </c:ModalContentPresenter.ModalContent>

</c:ModalContentPresenter>

特徴:

  • 任意のコンテンツを表示します。
  • モーダルコンテンツが表示されている間は、プライマリコンテンツを無効にしません。
  • モーダルコンテンツが表示されている間、プライマリコンテンツへのマウスとキーボードのアクセスを無効にします。
  • アプリケーション全体ではなく、対象となるコンテンツに対してのみモーダルです。
  • IsModalプロパティにバインドすることで、MVVMに適した方法で使用できます。
4
Benjamin Gale

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

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

2
Dean Chalk

ここではモーダルダイアログを探していません。 「ページ」コントロールを無効にし、ダイアログを表示し、ダイアログが閉じたときに再度有効にする関数が必要です。

モーダルダイアログが何を意味するのか理解しているかどうかはわかりませんが?

1
Mez