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

StackOverflow https://stackoverflow.com/questions/173652

  •  05-07-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

あなたのメッセージの解釈が正しい場合、あなたは何に似た何かが欲しい 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>

Show(Control view)メソッドも追加しました。このメソッドは「PART_DialogView」を見つけ、渡されたビューを Content プロパティに追加します。

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

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

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

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

これがお役に立てば幸いです!

他のヒント

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に優しい方法で使用できます。

ネストされたメッセージポンプを使用してモーダルコントロールを作成するだけではない理由

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top