只是一个序言,我意识到我正在以非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顺序而不添加/删除地图的子集合中的所有内容?|
答案 0 :(得分:3)
这个问题是可以解决的。我在搜索时发现了一些可能的解决方案。见下文。希望你能找到符合你的代码/情况的东西。
将弹出式窗口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;
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>
其他类似的stackoverflow问题可能有所帮助。