【问题标题】:How to disable a Grid (Panel) in XAML Metro app?如何在 XAML Metro 应用程序中禁用网格(面板)?
【发布时间】:2013-01-18 23:17:04
【问题描述】:

我想在 XAML Metro App 中模拟模式对话框。

所以我打算在所有控件上设置 .IsEnabled = false,除了将作为模态对话框的那个。

显然 IsEnabled 不在 Grid 中,不在 Panel 中,不在 FrameworkElement 中。 如何禁用它而不使用户控制它?

我猜 Sinofsky 走了不少弯路,以至于整个事情现在更像是 Escher 楼梯。我正在失去信心。请帮忙

【问题讨论】:

    标签: c# xaml windows-8 windows-runtime


    【解决方案1】:

    对不起,我参加聚会有点晚了……

    这是我创建模态弹出窗口的方法 - 我使用了一个弹出对话框,其中顶部和底部部分是透明的,因此它后面的任何内容都会显示出来。当弹出窗口打开时,我将其大小设置为覆盖整个屏幕。

    弹出窗口的顶部和底部也设置为自动调整大小(高度 = *),以便它们填满整个屏幕的顶部和底部。这可以防止任何输入进入下面的网格。

    这是我在 Visual Studio 中弹出窗口的屏幕截图:

    弹出框是一个有 5 行的网格,其中 3 行用于对话框本身,2 行用于透明顶部和底部。

    这是弹出窗口在我的应用中的外观。显然,网格通过透明的顶部和底部显示。由于弹出窗口填满了整个屏幕,因此任何输入(键盘或鼠标)都会转到它而不是下方的网格,这使得弹出窗口就像一个模态对话框。

    请注意,尽管使用此策略,您必须处理这些事件:

    • 屏幕调整大小(全屏、快照视图、填充视图) - 您需要调整弹出窗口的大小以适应每个视图状态
    • 屏幕旋转 - 再次,您必须在此处处理调整大小
    • 键盘弹出窗口 - 您需要向上移动弹出窗口,以便屏幕键盘不会干扰它。

    【讨论】:

      【解决方案2】:

      在背景内容上设置IsHitTestVisible = false

      此外,您可以将焦点设置在模态层根中的某些内容上,并在模态层根上将TabNavigation 设置为Cycle,以确保用户无法通过 Tab/Shift+Tab 跳出它。还要确保模态层都是命中测试固体 - 例如Transparent 或有一些其他填充,因此用户无法点击它。

      同时确保在您的模态层可见时不显示Popups

      【讨论】:

      • 我有过这样的想法,但转而选择了可见性。你确定这行得通吗?你不能用键盘在文本框中输入吗?
      • 这是不正确的答案。你仍然可以使用键盘 - 这是我试图避免的。
      【解决方案3】:

      不幸的是,似乎没有人知道(除了 Skakun 先生,他给出了错误的答案并且从不费心修改它)。

      因此我的解决方案(最简单的)是使有问题的元素隐藏 - 我找不到任何其他方法来“禁用”网格。

      如果我想正确禁用它,我将不得不编写一个递归函数来查找网格子项中的所有 FrameworkElements 并设置 IsEnabled = false。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        相关资源
        最近更新 更多