Adding Media to the Map
The Bing Maps WPF Control can display scalable or non-scalable images and videos. Though you can add any System.Windows.UIElement directly to the map, it is best to contain them in a MapLayer that is on top of the map. This provides better control over the elements that are added to the map. If you have multiple images or videos to display, you may need multiple map layers. For example, if you have a background image added to your map and you want video to be shown over top of it, you can add an image to the first map layer and a video to the second layer.
To display images on your map, you must add an Image object (a class in the System.Windows.Controls namespace) to a MapLayer. The Source property defines the type of image that you want to display (ImageSource). For example, you can add a BitmapImage to the map, myMap when you click the “Add Image” button in the following example.
<Window x:Class="WPFTestApplication.ShowImage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:m="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF" Width="1024" Height="768"> <Grid x:Name="LayoutRoot" Background="White" > <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="40"/> </Grid.RowDefinitions> <m:Map x:Name="myMap" Grid.Row="0" Grid.RowSpan="2" Center="37.1481402218342,-119.644248783588" ZoomLevel="6" CredentialsProvider="<strong>InsertBingMapsKey</strong>" /> <Button Click="addImageToMap" Opacity="0.8" Width="300" Height="40" Grid.Row="1" > <TextBlock>Show Image</TextBlock> </Button> </Grid> </Window>
Imports System Imports System.Windows Imports System.Windows.Controls Imports System.Globalization Imports System.Windows.Media Imports System.Windows.Media.Imaging Imports Microsoft.Maps.MapControl.WPF Imports Microsoft.Maps.MapControl.WPF.Design Namespace WPFTestApplication Partial Public Class SwitchMapViews Inherits Window Private locConverter As New LocationConverter() Public Sub New() InitializeComponent() //Set focus on map myMap.Focus() End Sub Private Sub addImageToMap(ByVal sender As Object, ByVal e As RoutedEventArgs) Dim imageLayer As New MapLayer() Dim image As New Image() image.Height = 150 'Define the URI location of the image Dim myBitmapImage As New BitmapImage() myBitmapImage.BeginInit() myBitmapImage.UriSource = New Uri("http://upload.wikimedia.org/wikipedia/commons/d/d4/Golden_Gate_Bridge10.JPG") ' To save significant application memory, set the DecodePixelWidth or ' DecodePixelHeight of the BitmapImage value of the image source to the desired ' height or width of the rendered image. If you don't do this, the application will ' cache the image as though it were rendered as its normal size rather then just ' the size that is displayed. ' Note: In order to preserve aspect ratio, set DecodePixelWidth ' or DecodePixelHeight but not both. 'Define the image display properties myBitmapImage.DecodePixelHeight = 150 myBitmapImage.EndInit() image.Source = myBitmapImage image.Opacity = 0.6 image.Stretch = System.Windows.Media.Stretch.None 'The map location to place the image at Dim location As New Location() With {.Latitude = 37.8197222222222, .Longitude = -122.478611111111} 'Center the image around the location specified Dim position As PositionOrigin = PositionOrigin.Center 'Add the image to the defined map layer imageLayer.AddChild(image, location, position) 'Add the image layer to the map myMap.Children.Add(imageLayer) End Sub End Class End Namespace
To display video feeds on your map, you must add a MediaElement object (a class in the System.Windows.Controls namespace) to a MapLayer. The System.Windows.Controls.MediaElement.Source property defines the URI location of the video feed. For example, you can add a MediaElement to the map, MyMap (assumed to be defined in the XAML design code), with the following code:
<Window x:Class="WPFTestApplication.ShowVideo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:m="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF" Width="1024" Height="768"> <Grid x:Name="LayoutRoot" Background="White" > <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="40"/> </Grid.RowDefinitions> <m:Map x:Name="myMap" Grid.Row="0" Grid.RowSpan="2" Center="37.1481402218342,-119.644248783588" ZoomLevel="6" CredentialsProvider="InsertBingMapsKey" /> <Button Click="addVideoToMap" Opacity="0.8" Width="300" Height="40" Grid.Row="1" > <TextBlock>Show Video</TextBlock> </Button> </Grid> </Window>
Imports System Imports System.Windows Imports System.Windows.Controls Imports System.Globalization Imports System.Windows.Media Imports Microsoft.Maps.MapControl.WPF Imports Microsoft.Maps.MapControl.WPF.Design Namespace WPFTestApplication Partial Public Class SwitchMapViews Inherits Window Private locConverter As New LocationConverter() Public Sub New() InitializeComponent() //Set focus on map myMap.Focus() End Sub Private Sub addVideoToMap(ByVal sender As Object, ByVal e As RoutedEventArgs) Dim videoLayer As New MapLayer() Dim video As New MediaElement() 'Define the URI location of the video video.Source = New Uri("http://mschnlnine.vo.llnwd.net/d1/ch9/9/2/9/9/1/4/TCS2NBCOlympics_ch9.wmv", UriKind.RelativeOrAbsolute) 'Define the video display properties video.Opacity = 0.8 video.Width = 250 video.Height = 200 'The map location to place the image at Dim location As New Location() With {.Latitude = 37.8197222222222, .Longitude = -122.478611111111} 'Center the image around the location specified Dim position As PositionOrigin = PositionOrigin.Center 'Add the image to the defined map layer videoLayer.AddChild(video, location, position) 'Add the image layer to the map myMap.Children.Add(videoLayer) End Sub End Class End Namespace