WPF的Bing地图,MapLayers / Pushpins的ZIndex?

时间:2012-12-24 19:31:07

标签: wpf silverlight xaml z-index bing-maps

只是一个序言,我意识到我正在以非WPF友好的方式执行我的解决方案。在一个完美的世界里,我将使用MapItemsControl。

好的,我正在使用Bing Maps控件进行WPF。这是我的Bing地图XAML

<m:Map CredentialsProvider="12345" 
           x:Name="myMap" UseInertia="True" Loaded="Map_Loaded"
           Width="1920" Height="990" Canvas.Top="110" ZoomLevel="5" Center="39.8282,-98.5795">
    <m:MapLayer x:Name="MyPushPinLayer">                
        <Canvas x:Name="ContentPopup" Visibility="Collapsed" Width="250">
            <Border Background="White" BorderThickness="1" BorderBrush="Gray" Width="250" Padding="5">
                <StackPanel Canvas.Left="20" Canvas.Top="10">
                    <TextBlock x:Name="ContentPopupText" FontSize="18" FontWeight="Bold" Foreground="#CF0000" Width="240" TextWrapping="Wrap">
                        </TextBlock>
                    <TextBlock x:Name="ContentAddress" FontSize="13" Foreground="Black" Width="240"  TextWrapping="Wrap"/>
                    <TextBlock x:Name="ContentQuestions" FontSize="13" Foreground="Black" Width="240" TextWrapping="Wrap" />
                </StackPanel>
            </Border>
        </Canvas>
    </m:MapLayer>
</m:Map>

基本上,这会绘制一张地图,我有一个maplayer,它会在点击时保存工具提示信息。在我的代码背后,我从服务中提取数据并将程序中的图钉添加到地图中,如下所示:

Pushpin pin = new Pushpin();
pin.Location = new Microsoft.Maps.MapControl.WPF.Location(location.latitude, location.longitude);
pin.Content = location.name;
pin.Template = LGPushPinTemplate;

pin.MouseDown += new MouseButtonEventHandler(pin_MouseDown);
myMap.Children.Add(pin);

非常简单。但是,因为我在XAML中定义了弹出层,并且在加载了地图后的子节点,所以图钉在地图的子结构中出现在最后,因此模式信息框出现在任何图钉下面。有没有办法重新排列这些项目的z顺序而不添加/删除地图的子集合中的所有内容?|

1 个答案:

答案 0 :(得分:3)

这个问题是可以解决的。我在搜索时发现了一些可能的解决方案。见下文。希望你能找到符合你的代码/情况的东西。

  1. 你能在最后动态创建弹出图层吗?与生成推针的方式类似。
  2. 将弹出式窗口Canvas.ZIndex设置为较大的数字。以下是ZIndex的更多解决方案:silverlight control: how to manage the ZIndex?

      

    zindex是父画布的附加属性。

         

    例如,我们为Bing Maps创建了“enhancedMapLayer”   http://deepearth.codeplex.com中的Silverlight控件并添加了   zindex就像这样的财产:

    public int ZIndex
    {
        get { return zIndex; }
        set
        {
            zIndex = value;
            if (Parent != null)
            {
                SetValue(Canvas.ZIndexProperty, zIndex);
            }
         }
     }
    
         

    在我们的infogeometry类中(为所有人提供标签,气球)   OGC几何类型,点,线串,多边形,多边形等)时   我们启动气球我们这样做:

       var layer = (EnhancedMapLayer) Parent;
       if (layer != null)
       {
           //set to top z-order
           prevZIndex = layer.ZIndex;
           layer.ZIndex = 1000;
           SetValue(Canvas.ZIndexProperty, 1000);
           applyTranslations();
           balloonShowStoryboard.Begin();
           balloonContainer.Visibility = Visibility.Visible;
           OnBalloon(new BalloonEventArgs { LayerID = layer.ID, ItemID = ItemID });
       }
    
         

    通过存储图层的上一个ZIndex,我们可以将其恢复到正确的位置   隐藏气球的命令。

         

    为了在层之间进行通信,我们使用了命令模式   Silverlight所以我们只需要打电话:

         

    Commands.ClosePopupCommand.Execute();

         

    要关闭所有其他气球,请订阅该事件:   Commands.ClosePopupCommand.Executed += ClosePopupCommand_Executed;

  3. This stackoverflow answer提供了一种很好的方法,包括提及Microsoft's Interactive Map SDK。基本上,尝试分层。

        <m:Map CredentialsProvider="Your Key">
            <m:MapLayer>
                <m:MapItemsControl x:Name="ListOfItems"
                            ItemTemplate="{StaticResource LogoTemplate}"
                            ItemsSource="{Binding MyLocalizedEntities}">
                </m:MapItemsControl>
            </m:MapLayer>
            <m:MapLayer>
                <!-- You can have content in multiple layers: Latter layers are infront of former ones. -->
            </m:MapLayer>
        </m:Map>
    
  4. 其他类似的stackoverflow问题可能有所帮助。