0

使用 Panorama 控件时,非活动 PanoramaItem 中的元素会响应点击事件。您可以使用以下 XAML 重现此内容,该 XAML 仅对 Windows Phone 8 SDK 附带的全景应用程序解决方案模板进行了非常小的修改。您可以看到第二个 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. 其次,关于如何解决这种行为的任何建议?
4

3 回答 3

0

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

于 2013-05-30T19:29:05.560 回答
0

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

于 2013-05-30T20:16:25.403 回答
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;
    }
}

当然,您需要将LoadedandSelectionChanged事件分别连接到Panorama_OnLoadedandPanorama_OnSelectionChanged方法。我还可以看到将其移至Behavior,您可以在应用程序中的其他全景图上使用它。

于 2013-05-30T20:34:50.200 回答