如何在弹出对话框打开时禁用后台GUI交互

时间:2014-07-23 10:39:13

标签: c# windows-8 windows-store-apps winrt-xaml windows-8.1

打开弹出对话框时有没有办法禁用后台GUI交互? 我的弹出对话框是UserControl,因此无法使用isEnabled为false属性手动设置该页面的内容,因为我的popup dismiss登录位于该usercontrol页面上。

提前致谢。

4 个答案:

答案 0 :(得分:2)

您可以在用户控件和背景网格集上设置背景网格IsHitTestVisible =" False"您的弹出窗口将在网格后定义,因此它位于顶部并可以接收用户输入。

要禁用应用栏,您可以在弹出窗口打开时禁用该栏。如果每个页面上都有不同的应用栏,那么您可以编写一种方法,在UI中找到任何应​​用栏并禁用它直到弹出窗口关闭。

WinRTXAMLToolkit有一个可视树辅助类,可用于查找应用栏。

var AppBars = Window.Current.Content.GetDescendentsOfType<type of app bar>();
foreach(var appBar in AppBars)
{
    appBar.IsEnabled=false;
}

隐藏弹出窗口后,重新启用应用栏。

答案 1 :(得分:1)

在打开弹出窗口的事件处理程序(Button)中,编写以下代码。

 private void PopupButton_Click(object sender, RoutedEventArgs e)
 {
    this.IsHitTestVisible = false;
    this.Opacity = 0.5;
    MyPopup.IsOpen = true;
 }

当弹出窗口关闭时,您可能会捕获该事件并编写以下代码。

private void MyPopup_Closed(object sender, object e)
{
    this.IsHitTestVisible = true;
    this.Opacity = 1;
}

这会产生与打开对话框时相同的视觉效果。

答案 2 :(得分:0)

我使用SwapChainPanel禁用父视图内容用户交互。此外,我在显示自定义弹出窗口时添加了灰色叠加层。

  <SwapChainPanel x:Name="DirectXPanel"  Visibility="{Binding IsOpen, Converter={StaticResource BooleanToVisibilityConverter}}" >
        <Border  CornerRadius="5" Opacity="0.60"  Background="#000000" ></Border>
    </SwapChainPanel>

   <UserControls:CustomLoginPanel x:Name="CustomLoginPanel" Height="220" Width="400"
               HorizontalAlignment="Center" 
                VerticalAlignment="Center"
                Grid.Row="0"
                IsOpen="{Binding IsOpen, Mode=TwoWay}"
                Margin="0,70,0,0"/>

这里ProgressDialog是我想在用户登录时显示的自定义弹出窗口。

当显示自定义弹出窗口时,

SwapChainPanel 将覆盖整个窗口。默认情况下它是隐藏的。

我的视图中存在

IsOpen 属性。此属性用于显示/隐藏Popover。

&#34; BooleanToVisibilityConverter&#34;是一个用于将布尔值转换为可见性的转换器

BooleanToVisibilityConverter.cs:

public sealed class BooleanToVisibilityConverter:IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return value is Visibility && (Visibility)value == Visibility.Visible;
    }
}

答案 3 :(得分:0)

禁用弹出控件未占用空间的解决方法可能实际占用该空间,并使“未使用”空间透明或部分透明以获得良好的消息对话框效果。

例如,如果您的弹出窗口看起来像经典的winrt消息对话框(全宽和垂直居中),请使弹出控件具有与背景相同的宽度和高度,并使弹出窗口的内容成为具有3行定义的网格。将实际内容放在中间行,因此它将垂直居中。然后在第一行中放置一个网格,背景颜色为黑色,不透明度为0.4,行数为3,因此占用所有空间。打开弹出窗口后,它会将焦点放在整个背景上,这样用户就无法与之交互,但仍能看到实际内容不重叠的背景。

这是我说的简单例子:

<UserControl ...>
    <Popup x:Name="PopupControl"
           IsLightDismissEnabled="False"
           Loaded="PopupControl_Loaded">

        <!-- The content of the Popup, a grid with 3 rows. The second row takes half of the space from the popup -->
        <Grid x:Name="PopupGrid">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="2*" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <!-- Place a grid on the first row with black background, a rowspan of 3 will take all the rows so the user cannot interct with the actual background. -->
            <Grid Grid.RowSpan="3"
                  Background="Black"
                  Opacity="0.4" />

            <!-- Here place the actual content of your popup. -->
            <Grid Grid.Row="1" Background="White">
                [Acutal content of the popup]
            </Grid>

        </Grid>
    </Popup>
</UserControl>

在用户控件的代码中:

// Finally make the popup control full screen.
private void PopupControl_Loaded(object sender, RoutedEventArgs e)
{
   this.PopupGrid.Height = Window.Current.CoreWindow.Bounds.Height;
   this.PopupGrid.Width = Window.Current.CoreWindow.Bounds.Width;
}