我想在 XAML Metro App 中模拟模式对话框。
因此,我打算在所有控件上设置 .IsEnabled = false ,除了将构成模式对话框的控件。
显然 IsEnabled 不在 Grid 中,不在 Panel 中,不在 FrameworkElement 中。如何禁用它而不使用户控制它?
我猜 Sinofsky 走了不少弯路,以至于整个事情现在更像是 Escher 楼梯。我正在失去信心。请帮忙
我想在 XAML Metro App 中模拟模式对话框。
因此,我打算在所有控件上设置 .IsEnabled = false ,除了将构成模式对话框的控件。
显然 IsEnabled 不在 Grid 中,不在 Panel 中,不在 FrameworkElement 中。如何禁用它而不使用户控制它?
我猜 Sinofsky 走了不少弯路,以至于整个事情现在更像是 Escher 楼梯。我正在失去信心。请帮忙
设置IsHitTestVisible = false
在背景内容上。
此外,您可以将焦点设置为模态层根中的某些内容,并设置TabNavigation
为Cycle
模态层根以确保用户无法使用 tab/shift+tab 退出它。还要确保模态层全部命中 test-solid - 例如Transparent
或有一些其他填充,因此用户无法单击它。
还要确保Popups
在您的模态层可见时不显示。
抱歉,我参加聚会有点晚了……
以下是我创建模式弹出窗口的方法 - 我使用了一个弹出对话框,其中顶部和底部部分是透明的,因此它后面的任何内容都会显示出来。当弹出窗口打开时,我将其大小设置为覆盖整个屏幕。
弹出窗口的顶部和底部也设置为自动调整大小(高度 = *),以便它们填满屏幕的整个顶部和底部。这可以防止任何输入进入下面的网格。
这是我在 Visual Studio 中弹出窗口的屏幕截图:
弹出窗口是一个有 5 行的网格,其中 3 行用于对话框本身,2 行用于透明顶部和底部。
这是弹出窗口在我的应用程序中的外观。显然,网格通过透明的顶部和底部显示。由于弹出窗口填满了整个屏幕,因此任何输入(键盘或鼠标)都会转到它而不是下面的网格,这使得弹出窗口就像一个模式对话框。
请注意,尽管使用此策略,您必须处理这些事件:
不幸的是,似乎没有人知道(除了给出错误答案并且从不费心修改它的 Skakun 先生)。
因此我的解决方案(最简单的)是使有问题的元素隐藏 - 我找不到任何其他方法来“禁用”网格。
如果我想正确禁用它,我将不得不编写一个递归函数来查找网格子项中的所有 FrameworkElements 并设置 IsEnabled = false。