WP8:即使非活动的PanoramaItem处于非活动状态,它也是可插入的

时间:2013-05-30 18:33:32

标签: windows-phone-8 windows-phone panorama-control

使用Panorama控件时,非活动PanoramaItem中的元素会响应点击事件。您可以使用以下XAML重现此操作,该操作仅通过Windows Phone 8 SDK附带的Panorama Application解决方案模板进行了轻微修改。您可以看到第二个PanoramaItem中的项目是如何处理的,即使该PanoramaItem未处于活动状态。

<phone:Panorama Title="my application">
    <phone:Panorama.Background>
        <ImageBrush ImageSource="/PanoramaApp1;component/Assets/PanoramaBackground.png"/>
    </phone:Panorama.Background>

    <!--Panorama item one-->
    <phone:PanoramaItem Header="first item">
        <!--Single line list with text wrapping-->
        <phone:LongListSelector Margin="0,0,-22,0" ItemsSource="{Binding Items}">
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,-6,0,12">
                        <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeExtraLarge}"/>
                    </StackPanel>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
    </phone:PanoramaItem>

    <!--Panorama item two-->
    <phone:PanoramaItem>
        <!--Double line list with image placeholder and text wrapping using a floating header that scrolls with the content-->
        <phone:LongListSelector Margin="0,-38,-22,2" ItemsSource="{Binding Items}">
            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="12,2,0,4" Height="105" Width="432" Tap="SecondItem_OnTap">
                        <!--Replace rectangle with image-->
                        <Border BorderThickness="1" Width="99" Height="99" BorderBrush="#FFFFC700" Background="#FFFFC700"/>
                        <StackPanel Width="311" Margin="8,-7,0,0">
                            <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Margin="10,0" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeLarge}" />
                            <TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="10,-2,10,0" Style="{StaticResource PhoneTextSubtleStyle}" />
                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>
    </phone:PanoramaItem>
</phone:Panorama>

注意第二个PanoramaItem中LongListSelector.ItemTemplate中的“SecondItem_OnTap”Tap事件处理程序连接。

我在手机上没有预先安装的每个应用中都观察到了这种行为,换言之,所有非Microsoft应用,包括Facebook和Pandora等应用。有没有人

  1. 首先,任何有关Microsoft和非Microsoft应用程序之间行为不同的见解;和
  2. 其次,有关如何解决此问题的任何建议吗?

3 个答案:

答案 0 :(得分:0)

这很麻烦,但您可以捕获Panorama的SelectionChanged事件并禁用可点击元素。

答案 1 :(得分:0)

是的,这是一个众所周知的全景控制问题。我们在其中一个应用中通过在非活动全景项目顶部创建透明叠加层来解决此问题。此方法的缺点是,如果您在覆盖图顶部开始侧滑,则手势将被忽略。对于我们最新的应用程序,我们完全忽略此行如果微软担心它,他们会解决它。至于为什么,微软显然不会在他们的应用程序中使用标准手机控件。

答案 2 :(得分:0)

谢谢你的答案!我解决了以下问题:

private void Panorama_OnSelectionChanged(object sender, SelectionChangedEventArgs e) {
    this.UpdateHitTestForPanoItems(this.Panorama.SelectedItem);
}

private void Panorama_OnLoaded(object sender, RoutedEventArgs e) {
    this.UpdateHitTestForPanoItems(this.Panorama.SelectedItem ?? this.Panorama.Items.FirstOrDefault());
}

private void UpdateHitTestForPanoItems(object selectedItem) {
    foreach (PanoramaItem item in this.Panorama.Items) {
        item.IsHitTestVisible = item == this.Panorama.SelectedItem;
    }
}

当然,您需要分别将LoadedSelectionChanged事件与Panorama_OnLoadedPanorama_OnSelectionChanged方法联系起来。我还可以看到将其移动到Behavior,您可以在应用中的其他全景图上使用它。