Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在不使用iEnabled的情况下禁用可视树部分中的键盘和鼠标事件?_.net_Wpf_Isenabled - Fatal编程技术网

.net 如何在不使用iEnabled的情况下禁用可视树部分中的键盘和鼠标事件?

.net 如何在不使用iEnabled的情况下禁用可视树部分中的键盘和鼠标事件?,.net,wpf,isenabled,.net,Wpf,Isenabled,我需要在WPF中构建伪模态对话框。也就是说,由于某些特定(技术)原因,软件不允许生成模式对话框。相反,用户应该在必要时与“嵌入式”模态对话框进行交互 我找到了一个与MVVM配合得很好的解决方案,该解决方案能够处理调度程序和模态对话框的同步特性。但是,我在后台GUI中禁用用户输入时遇到了一个问题。不幸的是,将所有控件设置为IsEnabled=false是不可接受的,因为它会更改背景控件的视觉状态(灰色阴影->可读性差) 有没有一种直接的方法可以在不改变视觉状态的情况下在后台禁用用户输入(包括焦点和

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

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

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


谢谢你的帮助

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

+----------------+
|                |
|  Transparent   |
|                |
|  +----------+  |
|  | dialog   |  |
|  | content  |  |
|  +----------+  |
|                |
+----------------+
但是,这有点像黑客

要直接解决您的问题,可以在控件的IsEnabled属性上使用触发器来防止颜色更改。或许有人可以提供一个带有Visual Studio的代码示例。:)

回应你的评论:


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

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

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

Window +----------------+ private void Window_PreviewKeyDown(object sender, | | KeyEventArgs e){ | Transparent | if (this.myDialog.Visibility == Visibility.Visible){ | | e.Handled = true; | +----------+ | } | | myDialog | | } | | content | | | +----------+ | | | +----------------+ 窗口 +----------------+私有无效窗口\u PreviewKeyDown(对象发送器, ||关键事件参数(e){ |透明|如果(this.myDialog.Visibility==Visibility.Visible){ || e.已处理=正确; | +----------+ | } || myDialog | |} ||内容|| | +----------+ | | | +----------------+
您可以设置
.ishitestvisible
属性以禁用该控件/窗口的任何鼠标单击。这与设置的工作原理相同。I启用,但没有视觉状态更改(灰色控件)。

我有一个项目,它提供了一个自定义的
框架元素
,允许您在主内容上显示模式内容

控件可以这样使用:

<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友好的方式使用
感谢您的回复!不幸的是,在应用程序中加入一个透明层仅仅是解决方案的一半(我现在就是这样)。我的问题是在透明层下面的层中禁用键盘焦点。可以对透明表面下方的控件进行制表:-)您可以将控件上的IsTabStop和Focusable属性设置为false以获得该行为。。。不过,我担心这个解决方案不是很优雅,它只会阻止鼠标事件。您仍然可以使用键盘从后台控件触发事件。