3

我需要在 WPF 中构建伪模式对话框。也就是说,由于某些特定(技术)原因,不允许该软件生成模式对话框。相反,用户应该在必要时与“嵌入式”模式对话框进行交互。

我找到了一个与 MVVM 配合得很好的解决方案,它处理了 Dispatcher 和模态对话框的同步特性。但是,我遇到了在后台 GUI 中禁用用户输入的问题。不幸的是,将所有控件设置为IsEnabled = false是不可接受的,因为它会更改背景控件的视觉状态(灰色阴影 -> 可读性差)。

有没有一种直接的方法可以在不改变视觉状态的情况下在后台禁用用户输入(包括焦点和键盘)?

谢谢你的帮助!

4

4 回答 4

4

您可以设置该.IsHitTestVisible属性以禁用对该控件/窗口的任何鼠标单击。这与设置相同.IsEnabled,但没有视觉状态更改(灰色控件)。

于 2011-10-08T20:44:52.907 回答
3

我一直在努力解决同样的问题(也是 MVVM)。我还使用 UserControl 覆盖而不是模式弹出窗口。(就我而言,我不喜欢 IsEnabled=false 不是因为禁用的样式,而是因为切换 IsEnabled 会使键盘焦点难以恢复。)

我正在使用覆盖解决方案(上图)来阻止鼠标操作。而对于“解决方案的另一半”——禁用键盘输入——我在主窗口中处理这个:

窗户
+----------------+ private void Window_PreviewKeyDown(object sender,
| | KeyEventArgs e){
| 透明 | 如果(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>

特征:

  • 显示任意内容。
  • 在显示模式内容时不禁用主要内容。
  • 在显示模式内容时禁用鼠标和键盘访问主要内容。
  • 仅对它所覆盖的内容是模态的,而不是整个应用程序。
  • 可以通过绑定到IsModal属性以对 MVVM 友好的方式使用。
于 2012-06-30T20:15:12.973 回答
0

部分解决方案可能是让您的“对话框”控件覆盖整个应用程序的窗口,但其中大部分是透明的,中间有不透明的对话框内容,例如:

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

但是,这有点骇人听闻。

要直接解决您的问题,您可以在控件的 IsEnabled 属性上使用触发器来防止颜色发生变化。也许有人在他们的盒子上装有 Visual Studio 可以提供代码示例。:)

回复您的评论:

我担心这个答案有点棘手,但您可以在控件上将 IsTabStop 和 Focusable 属性设置为 false 以获得该行为。

于 2009-07-12T04:20:47.990 回答