如何保持输入事件不会传播到网格的兄弟节点?

时间:2015-11-03 06:29:30

标签: c# xaml silverlight windows-phone-8 user-controls

我有一个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>

底层枢轴仍然可以移动。

2 个答案:

答案 0 :(得分:1)

如果WaitScreen是透明的,则触摸事件可以通过。

Big Edit将叠加层放入PopupControl

  1. 我建议你在usercontrol中添加一个overlayGrid ,但在下添加Usercontrol的内容 顺序
  2. 该控件是半透明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不能是父级和子级,而是兄弟姐妹。

    1. 在Waitscreen可见时显示Usercontrol
    2. <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正在进行某种手势或触摸事件,而我无法在叠加层中捕获这些事件。也许操作系统正在做一些特别的事情,令我烦恼,或者我可能只是在某些我尚未发现的地方做错了。