26

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

4

4 に答える 4

26

私があなたのメッセージを正しく解釈しているのなら、 ビリー・ホリスが彼の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>

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

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

お役に立てれば!

于 2008-10-06T10:05:15.563 に答える
4

私は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>

特徴:

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

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

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

于 2010-11-12T10:43:19.520 に答える
1

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

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

于 2008-10-06T09:42:43.330 に答える