Following on from here, I thought I’d add a little bit of pushpin support to my basic Virtual Earth control for WPF.
Essentially, I added a new property to the control called PushPins and each one of those is just a tuple of;
{ Latitude, Longitude, Text }
to be placed on the map.
This means that from XAML I can create a set of pushpins in a declarative way as in;
<ve:VirtualEarth x:Name="veControl" Grid.Column="1" ZoomLevel="{Binding Path=Value, ElementName=slidey}" Latitude="{Binding Path=Text, ElementName=txtLat}" Longitude="{Binding Path=Text, ElementName=txtLon}" MapStyle="{Binding Path=Text, ElementName=cmbMapStyle}"> <ve:VirtualEarth.PushPins> <ve:PushPin Latitude="47.6" Longitude="-122.33" Text="Seattle 1" /> <ve:PushPin Latitude="47.7" Longitude="-122.33" Text="Seattle 2" /> <ve:PushPin Latitude="47.8" Longitude="-122.33" Text="Seattle 3" /> </ve:VirtualEarth.PushPins> </ve:VirtualEarth>
or I could databind them but either way in code if I want to manipulate that collection I can just do something like;
veControl.PushPins.Remove(p);
or;
PushPin p = new PushPin() { Latitude = double.Parse(txtAddLat.Text), Longitude = double.Parse(txtAddLon.Text), Text = txtAddName.Text }; veControl.PushPins.Add(p);
and that seems to work reasonably well. I also added a lookup routine which will asynchronously go and look up a postcode and bring it back as a Lat/Lon which means I can now write code such as;
veControl.BeginLookupPostCode(txtPostcode.Text, Callback, txtPostcode.Text);
and I’ll get a callback;
void Callback(IAsyncResult result) { try { PostCodeLookupResult postCode = veControl.EndLookupPostCode(result); txtAddLat.Text = postCode.Latitude.ToString(); txtAddLon.Text = postCode.Longitude.ToString(); } catch (Exception e) { MessageBox.Show(e.Message); } }
which contains the Lat/Lon of the post-code that I looked up. What I haven’t done is to implement INotifyPropertyChanged on a PushPin and then move the pin on the map if you change a property – I’d currently have to remove and re-add any pushpin that changed.
I added some support for PushPins into my little test harness which now looks like;
and allows me to basically manipulate the new functionality.
Once again, I’ve put the code up here for download.