4

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

好的,所以我正在为 WPF 使用 Bing Maps 控件。这是我的 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>

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

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 顺序,而无需从地图的子集合中添加/删除所有内容?|

4

1 回答 1

3

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

  1. 你能在最后动态创建弹出层吗?类似于您生成图钉的方式。
  2. 将弹出窗口设置Canvas.ZIndex为较大的数字。以下是 ZIndex 的更多解决方案:silverlight control:如何管理 ZIndex?

    zindex 是父画布的附加属性。

    例如,我们在http://deepearth.codeplex.com中为 Bing 地图 Silverlight 控件创建了一个“enhancedMapLayer”,并将 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. 这个 stackoverflow 答案提供了一个很好的方法,包括提到Microsoft 的 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 问题。

于 2012-12-27T03:26:16.053 回答