打开弹出对话框时有没有办法禁用后台GUI交互? 我的弹出对话框是UserControl,因此无法使用isEnabled为false属性手动设置该页面的内容,因为我的popup dismiss登录位于该usercontrol页面上。
提前致谢。
答案 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;
}