3

WPF で疑似モーダル ダイアログを作成する必要があります。つまり、特定の (技術的な) 理由により、ソフトウェアはモーダル ダイアログを生成することが許可されていません。代わりに、ユーザーは必要に応じて「埋め込まれた」モーダル ダイアログを操作する必要があります。

MVVM とうまく連携し、Dispatcher とモーダル ダイアログの同期文字を処理するソリューションを見つけました。ただし、バックグラウンド GUI でユーザー入力を無効にするという問題に直面しています。残念ながら、すべてのコントロールをIsEnabled = falseに設定することは受け入れられません。これは、バックグラウンド コントロールの視覚的な状態が変化するためです (灰色の色合い -> 可読性が低下します)。

視覚的な状態を変更せずに、バックグラウンドでユーザー入力 (フォーカスとキーボードを含む) を無効にする簡単な方法はありますか?

ご協力いただきありがとうございます!

4

4 に答える 4

4

プロパティを設定して、.IsHitTestVisibleそのコントロール/ウィンドウへのマウスクリックを無効にすることができます。これは settings と同じように機能します.IsEnabledが、視覚的な状態の変化 (灰色のコントロール) はありません。

于 2011-10-08T20:44:52.907 に答える
3

私は同じ問題(MVVMも)に苦労しています。また、モーダル ポップアップの代わりに UserControl オーバーレイを使用しています。(私の場合、IsEnabled=false が嫌いなのは、スタイルが無効になっているからではなく、IsEnabled を切り替えるとキーボード フォーカスを取り戻すのが難しくなるためです。)

マウス操作をブロックするためにオーバーレイ ソリューション (上記) を使用しています。そして、「ソリューションの残りの半分」 - - キーボード入力の無効化 - については、メイン ウィンドウでこれを処理しています。

窓
+----------------+ private void Window_PreviewKeyDown(オブジェクト送信者、
| | | | KeyEventArgs e){
| | 透明 | if (this.myDialog.Visibility == Visibility.Visible){
| | | | e.Handled = true;
| | +---------+ | }
| | | | マイダイアログ | | | }
| | | | コンテンツ | | |
| | +---------+ |
| | | |
+----------------+

于 2009-07-30T22:23:04.450 に答える
2

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:15:12.973 に答える
0

部分的な解決策は、「ダイアログ」コントロールがアプリケーションのウィンドウ全体をカバーするようにすることですが、そのほとんどを透明にし、中間に不透明なダイアログ コンテンツを配置します。

+----------------+
|                |
|  Transparent   |
|                |
|  +----------+  |
|  | dialog   |  |
|  | content  |  |
|  +----------+  |
|                |
+----------------+

しかし、それはちょっとしたハックです。

質問に直接対処するには、コントロールの IsEnabled プロパティでトリガーを使用して、色が変化しないようにします。おそらく、ボックスに Visual Studio を搭載している誰かがコード サンプルを提供できます。:)

コメントへの返信:

この答えがややこしくなっているのではないかと心配していますが、コントロールで IsTabStop プロパティと Focusable プロパティを false に設定して、その動作を実現できます。

于 2009-07-12T04:20:47.990 に答える