我有一个Windows Phone 8应用程序页面。页面有一个根网格,其中有一个Grid元素,包含页面的常规控件。根网格中还有一个用户控件。 Grid和usercontrol都在根网格中的0,0中。现在的问题是,当我使用户控件可见并使用它来显示一些“请稍候”信息时,保存应用程序的所有正常控件的另一个网格仍会获得触摸输入。
整个想法是,冗长的操作会导致用户控件显示半透明背景和等待的消息。我想以某种方式将其设置为捕获所有输入,但没有任何作用。
这是usercontrol:
<UserControl x:Class="UserControls.ProgressPopup" ...>
<Grid Name="ContentArea" MinWidth="200" MinHeight="200"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Margin="0" ManipulationStarted="ContentArea_ManipulationStarted"
Tap="ContentArea_Tap"
MouseLeftButtonDown="ContentArea_MouseLeftButtonDown">
<Rectangle Opacity="0.85" Name="TheBackground"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Fill="{StaticResource PhoneBackgroundBrush}"/>
<ProgressBar Background="Transparent" Opacity="1" x:Name="ProgressBar"
IsIndeterminate="{Binding bIsIndeterminate}"
HorizontalAlignment="Stretch" Width="auto"
Height="12" Margin="0,-30,0,0"/>
<TextBlock ... />
</Grid>
</UserControl>
以下是页面上的使用方法:
<phone:PhoneApplicationPage
x:Class="AirMobility.Pages.MainPage"
... >
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid Background="Transparent" Margin="0" x:Name="PageStuff">
...
</Grid>
<usercontrols:ProgressPopup Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" x:Name="WaitScreen" Visibility="Collapsed" Background="Transparent"/>
</Grid>
</phone:PhoneApplicationPage>
当名为“WaitScreen”的用户控件变为可见时,“PageStuff”网格及其中的控件仍然会被输入。该网格内部是一个枢轴控件,并且仍可以滚动旋转控件的页面。我试图获取ManipulationStarted事件并设置e.handler = true以停止传播,但它不起作用。似乎没什么用。
有关如何在usercontrol或xaml页面中usercontrol的定义中处理此问题的任何想法?我只是不想以某种方式在每个具有这些“WaitScreen”用户控件之一的页面上添加一堆事件处理程序。
[EDIT ...]
我尝试了usercontrol的这种变体,它仍然不起作用:
<UserControl x:Class="UserControls.ProgressPopup"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeLarge}">
<Grid Name="ContentArea" MinWidth="200" MinHeight="200" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0" Background="#01808080">
<Grid Name="TheBackground" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#80204080"/>
<ProgressBar Background="Transparent" Opacity="1" x:Name="ProgressBar"
IsIndeterminate="{Binding bIsIndeterminate}" HorizontalAlignment="Stretch" Width="auto" Height="12" Margin="0,-30,0,0"/>
<TextBlock Name="textBlock" Foreground="{StaticResource PhoneForegroundBrush}" Text="{Binding Text}" MinWidth="200" TextAlignment="Center"
Opacity="1" Margin="0,14,0,0" VerticalAlignment="Center" HorizontalAlignment="Stretch" Height="40" FontSize="{Binding Source={StaticResource PhoneFontSizeNormal}}" FontFamily="{Binding Source={StaticResource PhoneFontFamilyNormal}}" />
</Grid>
</UserControl>
底层枢轴仍然可以移动。
答案 0 :(得分:1)
如果WaitScreen是透明的,则触摸事件可以通过。
Big Edit将叠加层放入PopupControl
该控件是半透明(Background="#80204080"
)所以它应该捕获鼠标事件而不让它们流过。
<UserControl x:Class="..." ... />
<Grid x:Name="popupLayoutRoot">
<Grid x:Name="overlayGrid" Background="#80204080" />
<Grid x:Name="visiblePopupContent"
HorizontalAlignment="Center"
VerticalAlignment="Center" >
<TextBlock Text="Action in progress..."
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</Grid>
overlayGrid和visiblePopupContent不能是父级和子级,而是兄弟姐妹。
Usercontrol
:<phone:PhoneApplicationPage>
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid Background="Transparent" Margin="0" x:Name="PageStuff">
</Grid>
<usercontrols:ProgressPopup Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" x:Name="WaitScreen" Visibility="Collapsed" Background="Transparent"/>
</Grid>
</phone:PhoneApplicationPage>
以下是完整解决方案的链接:http://1drv.ms/1lm6jwN
此致
答案 1 :(得分:0)
我尝试添加另一个&lt; Grid&gt;页面本身的元素,而不是用户控件,始终覆盖数据透视表控件。我硬编码它的背景颜色为#80ff0000,通过粉红色,我仍然可以移动数据透视控件。
我的解决方案违反了将所有弹出代码保留在弹出窗口中的要求,涉及在等待屏幕可见时为枢轴控件设置IsHittestVisible = false。这并不理想,因为其他页面不使用数据透视控件,因此需要特定于页面的“ShowWaitScreen()”方法。我不喜欢代码冗余,但现在这样做。
我认为Pivot Control正在进行某种手势或触摸事件,而我无法在叠加层中捕获这些事件。也许操作系统正在做一些特别的事情,令我烦恼,或者我可能只是在某些我尚未发现的地方做错了。