diff --git a/Demo.WindowsPresentation/Windows/MainWindow.xaml.cs b/Demo.WindowsPresentation/Windows/MainWindow.xaml.cs new file mode 100644 --- /dev/null +++ b/Demo.WindowsPresentation/Windows/MainWindow.xaml.cs @@ -0,0 +1,990 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Imaging; +using System.Windows.Threading; +using Demo.WindowsForms; +using Demo.WindowsPresentation.CustomMarkers; +using GMap.NET; +using GMap.NET.MapProviders; +using GMap.NET.WindowsPresentation; + +namespace Demo.WindowsPresentation +{ + public partial class MainWindow : Window + { + PointLatLng start; + PointLatLng end; + + // marker + GMapMarker currentMarker; + + // zones list + List Circles = new List(); + + public MainWindow() + { + InitializeComponent(); + + // add your custom map db provider + //MySQLPureImageCache ch = new MySQLPureImageCache(); + //ch.ConnectionString = @"server=sql2008;User Id=trolis;Persist Security Info=True;database=gmapnetcache;password=trolis;"; + //MainMap.Manager.SecondaryCache = ch; + + // set your proxy here if need + //GMapProvider.WebProxy = new WebProxy("10.2.0.100", 8080); + //GMapProvider.WebProxy.Credentials = new NetworkCredential("ogrenci@bilgeadam.com", "bilgeada"); + + // set cache mode only if no internet avaible + if(!Stuff.PingNetwork("pingtest.net")) + { + MainMap.Manager.Mode = AccessMode.CacheOnly; + MessageBox.Show("No internet connection available, going to CacheOnly mode.", "GMap.NET - Demo.WindowsPresentation", MessageBoxButton.OK, MessageBoxImage.Warning); + } + + // config map + MainMap.MapProvider = GMapProviders.OpenStreetMap; + MainMap.Position = new PointLatLng(54.6961334816182, 25.2985095977783); + + //MainMap.ScaleMode = ScaleModes.Dynamic; + + // map events + MainMap.OnPositionChanged += new PositionChanged(MainMap_OnCurrentPositionChanged); + MainMap.OnTileLoadComplete += new TileLoadComplete(MainMap_OnTileLoadComplete); + MainMap.OnTileLoadStart += new TileLoadStart(MainMap_OnTileLoadStart); + MainMap.OnMapTypeChanged += new MapTypeChanged(MainMap_OnMapTypeChanged); + MainMap.MouseMove += new System.Windows.Input.MouseEventHandler(MainMap_MouseMove); + MainMap.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(MainMap_MouseLeftButtonDown); + MainMap.MouseEnter += new MouseEventHandler(MainMap_MouseEnter); + + // get map types + comboBoxMapType.ItemsSource = GMapProviders.List; + comboBoxMapType.DisplayMemberPath = "Name"; + comboBoxMapType.SelectedItem = MainMap.MapProvider; + + // acccess mode + comboBoxMode.ItemsSource = Enum.GetValues(typeof(AccessMode)); + comboBoxMode.SelectedItem = MainMap.Manager.Mode; + + // get cache modes + checkBoxCacheRoute.IsChecked = MainMap.Manager.UseRouteCache; + checkBoxGeoCache.IsChecked = MainMap.Manager.UseGeocoderCache; + + // setup zoom min/max + sliderZoom.Maximum = MainMap.MaxZoom; + sliderZoom.Minimum = MainMap.MinZoom; + + // get position + textBoxLat.Text = MainMap.Position.Lat.ToString(CultureInfo.InvariantCulture); + textBoxLng.Text = MainMap.Position.Lng.ToString(CultureInfo.InvariantCulture); + + // get marker state + checkBoxCurrentMarker.IsChecked = true; + + // can drag map + checkBoxDragMap.IsChecked = MainMap.CanDragMap; + +#if DEBUG + checkBoxDebug.IsChecked = true; +#endif + + //validator.Window = this; + + // set current marker + currentMarker = new GMapMarker(MainMap.Position); + { + currentMarker.Shape = new CustomMarkerRed(this, currentMarker, "custom position marker"); + currentMarker.Offset = new System.Windows.Point(-15, -15); + currentMarker.ZIndex = int.MaxValue; + MainMap.Markers.Add(currentMarker); + } + + //if(false) + { + // add my city location for demo + GeoCoderStatusCode status = GeoCoderStatusCode.Unknow; + + PointLatLng? city = GMapProviders.GoogleMap.GetPoint("Lithuania, Vilnius", out status); + if(city != null && status == GeoCoderStatusCode.G_GEO_SUCCESS) + { + GMapMarker it = new GMapMarker(city.Value); + { + it.ZIndex = 55; + it.Shape = new CustomMarkerDemo(this, it, "Welcome to Lithuania! ;}"); + } + MainMap.Markers.Add(it); + + #region -- add some markers and zone around them -- + //if(false) + { + List objects = new List(); + { + string area = "Antakalnis"; + PointLatLng? pos = GMapProviders.GoogleMap.GetPoint("Lithuania, Vilnius, " + area, out status); + if(pos != null && status == GeoCoderStatusCode.G_GEO_SUCCESS) + { + objects.Add(new PointAndInfo(pos.Value, area)); + } + } + { + string area = "Senamiestis"; + PointLatLng? pos = GMapProviders.GoogleMap.GetPoint("Lithuania, Vilnius, " + area, out status); + if(pos != null && status == GeoCoderStatusCode.G_GEO_SUCCESS) + { + objects.Add(new PointAndInfo(pos.Value, area)); + } + } + { + string area = "Pilaite"; + PointLatLng? pos = GMapProviders.GoogleMap.GetPoint("Lithuania, Vilnius, " + area, out status); + if(pos != null && status == GeoCoderStatusCode.G_GEO_SUCCESS) + { + objects.Add(new PointAndInfo(pos.Value, area)); + } + } + AddDemoZone(8.8, city.Value, objects); + } + #endregion + } + + if(MainMap.Markers.Count > 1) + { + MainMap.ZoomAndCenterMarkers(null); + } + } + + // perfromance test + timer.Interval = TimeSpan.FromMilliseconds(44); + timer.Tick += new EventHandler(timer_Tick); + + // transport demo + transport.DoWork += new DoWorkEventHandler(transport_DoWork); + transport.ProgressChanged += new ProgressChangedEventHandler(transport_ProgressChanged); + transport.WorkerSupportsCancellation = true; + transport.WorkerReportsProgress = true; + } + + void MainMap_MouseEnter(object sender, MouseEventArgs e) + { + MainMap.Focus(); + } + + #region -- performance test-- + public RenderTargetBitmap ToImageSource(FrameworkElement obj) + { + // Save current canvas transform + Transform transform = obj.LayoutTransform; + obj.LayoutTransform = null; + + // fix margin offset as well + Thickness margin = obj.Margin; + obj.Margin = new Thickness(0, 0, margin.Right - margin.Left, margin.Bottom - margin.Top); + + // Get the size of canvas + System.Windows.Size size = new System.Windows.Size(obj.Width, obj.Height); + + // force control to Update + obj.Measure(size); + obj.Arrange(new Rect(size)); + + RenderTargetBitmap bmp = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96, 96, PixelFormats.Pbgra32); + bmp.Render(obj); + + if(bmp.CanFreeze) + { + bmp.Freeze(); + } + + // return values as they were before + obj.LayoutTransform = transform; + obj.Margin = margin; + + return bmp; + } + + double NextDouble(Random rng, double min, double max) + { + return min + (rng.NextDouble() * (max - min)); + } + + Random r = new Random(); + + int tt = 0; + void timer_Tick(object sender, EventArgs e) + { + var pos = new PointLatLng(NextDouble(r, MainMap.ViewArea.Top, MainMap.ViewArea.Bottom), NextDouble(r, MainMap.ViewArea.Left, MainMap.ViewArea.Right)); + GMapMarker m = new GMapMarker(pos); + { + var s = new Test((tt++).ToString()); + + var image = new Image(); + { + RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality); + image.Stretch = Stretch.None; + image.Opacity = s.Opacity; + + image.MouseEnter += new System.Windows.Input.MouseEventHandler(image_MouseEnter); + image.MouseLeave += new System.Windows.Input.MouseEventHandler(image_MouseLeave); + + image.Source = ToImageSource(s); + } + + m.Shape = image; + + m.Offset = new System.Windows.Point(-s.Width, -s.Height); + } + MainMap.Markers.Add(m); + + if(tt >= 333) + { + timer.Stop(); + tt = 0; + } + } + + void image_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) + { + Image img = sender as Image; + img.RenderTransform = null; + } + + void image_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) + { + Image img = sender as Image; + img.RenderTransform = new ScaleTransform(1.2, 1.2, 12.5, 12.5); + } + + DispatcherTimer timer = new DispatcherTimer(); + #endregion + + #region -- transport demo -- + BackgroundWorker transport = new BackgroundWorker(); + + readonly List trolleybus = new List(); + readonly Dictionary trolleybusMarkers = new Dictionary(); + + readonly List bus = new List(); + readonly Dictionary busMarkers = new Dictionary(); + + bool firstLoadTrasport = true; + + void transport_ProgressChanged(object sender, ProgressChangedEventArgs e) + { + using(Dispatcher.DisableProcessing()) + { + lock(trolleybus) + { + foreach(VehicleData d in trolleybus) + { + GMapMarker marker; + + if(!trolleybusMarkers.TryGetValue(d.Id, out marker)) + { + marker = new GMapMarker(new PointLatLng(d.Lat, d.Lng)); + marker.Tag = d.Id; + marker.Shape = new CircleVisual(marker, Brushes.Red); + + trolleybusMarkers[d.Id] = marker; + MainMap.Markers.Add(marker); + } + else + { + marker.Position = new PointLatLng(d.Lat, d.Lng); + var shape = (marker.Shape as CircleVisual); + { + shape.Text = d.Line; + shape.Angle = d.Bearing; + shape.Tooltip.SetValues("TrolleyBus", d); + + if(shape.IsChanged) + { + shape.UpdateVisual(false); + } + } + } + } + } + + lock(bus) + { + foreach(VehicleData d in bus) + { + GMapMarker marker; + + if(!busMarkers.TryGetValue(d.Id, out marker)) + { + marker = new GMapMarker(new PointLatLng(d.Lat, d.Lng)); + marker.Tag = d.Id; + + var v = new CircleVisual(marker, Brushes.Blue); + { + v.Stroke = new Pen(Brushes.Gray, 2.0); + } + marker.Shape = v; + + busMarkers[d.Id] = marker; + MainMap.Markers.Add(marker); + } + else + { + marker.Position = new PointLatLng(d.Lat, d.Lng); + var shape = (marker.Shape as CircleVisual); + { + shape.Text = d.Line; + shape.Angle = d.Bearing; + shape.Tooltip.SetValues("Bus", d); + + if(shape.IsChanged) + { + shape.UpdateVisual(false); + } + } + } + } + } + + if(firstLoadTrasport) + { + firstLoadTrasport = false; + } + } + } + + void transport_DoWork(object sender, DoWorkEventArgs e) + { + while(!transport.CancellationPending) + { + try + { + lock(trolleybus) + { + Stuff.GetVilniusTransportData(TransportType.TrolleyBus, string.Empty, trolleybus); + } + + lock(bus) + { + Stuff.GetVilniusTransportData(TransportType.Bus, string.Empty, bus); + } + + transport.ReportProgress(100); + } + catch(Exception ex) + { + Debug.WriteLine("transport_DoWork: " + ex.ToString()); + } + Thread.Sleep(3333); + } + trolleybusMarkers.Clear(); + busMarkers.Clear(); + } + + #endregion + + // add objects and zone around them + void AddDemoZone(double areaRadius, PointLatLng center, List objects) + { + var objectsInArea = from p in objects + where MainMap.MapProvider.Projection.GetDistance(center, p.Point) <= areaRadius + select new + { + Obj = p, + Dist = MainMap.MapProvider.Projection.GetDistance(center, p.Point) + }; + if(objectsInArea.Any()) + { + var maxDistObject = (from p in objectsInArea + orderby p.Dist descending + select p).First(); + + // add objects to zone + foreach(var o in objectsInArea) + { + GMapMarker it = new GMapMarker(o.Obj.Point); + { + it.ZIndex = 55; + var s = new CustomMarkerDemo(this, it, o.Obj.Info + ", distance from center: " + o.Dist + "km."); + it.Shape = s; + } + + MainMap.Markers.Add(it); + } + + // add zone circle + //if(false) + { + GMapMarker it = new GMapMarker(center); + it.ZIndex = -1; + + Circle c = new Circle(); + c.Center = center; + c.Bound = maxDistObject.Obj.Point; + c.Tag = it; + c.IsHitTestVisible = false; + + UpdateCircle(c); + Circles.Add(it); + + it.Shape = c; + MainMap.Markers.Add(it); + } + } + } + + // calculates circle radius + void UpdateCircle(Circle c) + { + var pxCenter = MainMap.FromLatLngToLocal(c.Center); + var pxBounds = MainMap.FromLatLngToLocal(c.Bound); + + double a = (double)(pxBounds.X - pxCenter.X); + double b = (double)(pxBounds.Y - pxCenter.Y); + var pxCircleRadius = Math.Sqrt(a * a + b * b); + + c.Width = 55 + pxCircleRadius * 2; + c.Height = 55 + pxCircleRadius * 2; + (c.Tag as GMapMarker).Offset = new System.Windows.Point(-c.Width / 2, -c.Height / 2); + } + + void MainMap_OnMapTypeChanged(GMapProvider type) + { + sliderZoom.Minimum = MainMap.MinZoom; + sliderZoom.Maximum = MainMap.MaxZoom; + } + + void MainMap_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + System.Windows.Point p = e.GetPosition(MainMap); + currentMarker.Position = MainMap.FromLocalToLatLng((int)p.X, (int)p.Y); + } + + // move current marker with left holding + void MainMap_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) + { + if(e.LeftButton == System.Windows.Input.MouseButtonState.Pressed) + { + System.Windows.Point p = e.GetPosition(MainMap); + currentMarker.Position = MainMap.FromLocalToLatLng((int)p.X, (int)p.Y); + } + } + + // zoo max & center markers + private void button13_Click(object sender, RoutedEventArgs e) + { + MainMap.ZoomAndCenterMarkers(null); + + /* + PointAnimation panMap = new PointAnimation(); + panMap.Duration = TimeSpan.FromSeconds(1); + panMap.From = new Point(MainMap.Position.Lat, MainMap.Position.Lng); + panMap.To = new Point(0, 0); + Storyboard.SetTarget(panMap, MainMap); + Storyboard.SetTargetProperty(panMap, new PropertyPath(GMapControl.MapPointProperty)); + + Storyboard panMapStoryBoard = new Storyboard(); + panMapStoryBoard.Children.Add(panMap); + panMapStoryBoard.Begin(this); + */ + } + + // tile louading starts + void MainMap_OnTileLoadStart() + { + System.Windows.Forms.MethodInvoker m = delegate() + { + progressBar1.Visibility = Visibility.Visible; + }; + + try + { + this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, m); + } + catch + { + } + } + + // tile loading stops + void MainMap_OnTileLoadComplete(long ElapsedMilliseconds) + { + MainMap.ElapsedMilliseconds = ElapsedMilliseconds; + + System.Windows.Forms.MethodInvoker m = delegate() + { + progressBar1.Visibility = Visibility.Hidden; + groupBox3.Header = "loading, last in " + MainMap.ElapsedMilliseconds + "ms"; + }; + + try + { + this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, m); + } + catch + { + } + } + + // current location changed + void MainMap_OnCurrentPositionChanged(PointLatLng point) + { + mapgroup.Header = "gmap: " + point; + } + + // reload + private void button1_Click(object sender, RoutedEventArgs e) + { + MainMap.ReloadMap(); + } + + // enable current marker + private void checkBoxCurrentMarker_Checked(object sender, RoutedEventArgs e) + { + if(currentMarker != null) + { + MainMap.Markers.Add(currentMarker); + } + } + + // disable current marker + private void checkBoxCurrentMarker_Unchecked(object sender, RoutedEventArgs e) + { + if(currentMarker != null) + { + MainMap.Markers.Remove(currentMarker); + } + } + + // enable map dragging + private void checkBoxDragMap_Checked(object sender, RoutedEventArgs e) + { + MainMap.CanDragMap = true; + } + + // disable map dragging + private void checkBoxDragMap_Unchecked(object sender, RoutedEventArgs e) + { + MainMap.CanDragMap = false; + } + + // goto! + private void button2_Click(object sender, RoutedEventArgs e) + { + try + { + double lat = double.Parse(textBoxLat.Text, CultureInfo.InvariantCulture); + double lng = double.Parse(textBoxLng.Text, CultureInfo.InvariantCulture); + + MainMap.Position = new PointLatLng(lat, lng); + } + catch(Exception ex) + { + MessageBox.Show("incorrect coordinate format: " + ex.Message); + } + } + + // goto by geocoder + private void textBoxGeo_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) + { + if(e.Key == System.Windows.Input.Key.Enter) + { + GeoCoderStatusCode status = MainMap.SetCurrentPositionByKeywords(textBoxGeo.Text); + if(status != GeoCoderStatusCode.G_GEO_SUCCESS) + { + MessageBox.Show("Google Maps Geocoder can't find: '" + textBoxGeo.Text + "', reason: " + status.ToString(), "GMap.NET", MessageBoxButton.OK, MessageBoxImage.Exclamation); + } + else + { + currentMarker.Position = MainMap.Position; + } + } + } + + // zoom changed + private void sliderZoom_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + // updates circles on map + foreach(var c in Circles) + { + UpdateCircle(c.Shape as Circle); + } + } + + // zoom up + private void czuZoomUp_Click(object sender, RoutedEventArgs e) + { + MainMap.Zoom = ((int)MainMap.Zoom) + 1; + } + + // zoom down + private void czuZoomDown_Click(object sender, RoutedEventArgs e) + { + MainMap.Zoom = ((int)(MainMap.Zoom + 0.99)) - 1; + } + + // prefetch + private void button3_Click(object sender, RoutedEventArgs e) + { + RectLatLng area = MainMap.SelectedArea; + if(!area.IsEmpty) + { + for(int i = (int)MainMap.Zoom; i <= MainMap.MaxZoom; i++) + { + MessageBoxResult res = MessageBox.Show("Ready ripp at Zoom = " + i + " ?", "GMap.NET", MessageBoxButton.YesNoCancel); + + if(res == MessageBoxResult.Yes) + { + TilePrefetcher obj = new TilePrefetcher(); + obj.Owner = this; + obj.ShowCompleteMessage = true; + obj.Start(area, i, MainMap.MapProvider, 100); + } + else if(res == MessageBoxResult.No) + { + continue; + } + else if(res == MessageBoxResult.Cancel) + { + break; + } + } + } + else + { + MessageBox.Show("Select map area holding ALT", "GMap.NET", MessageBoxButton.OK, MessageBoxImage.Exclamation); + } + } + + // access mode + private void comboBoxMode_DropDownClosed(object sender, EventArgs e) + { + MainMap.Manager.Mode = (AccessMode)comboBoxMode.SelectedItem; + MainMap.ReloadMap(); + } + + // clear cache + private void button4_Click(object sender, RoutedEventArgs e) + { + if(MessageBox.Show("Are You sure?", "Clear GMap.NET cache?", MessageBoxButton.OKCancel, MessageBoxImage.Warning) == MessageBoxResult.OK) + { + try + { + MainMap.Manager.PrimaryCache.DeleteOlderThan(DateTime.Now, null); + MessageBox.Show("Done. Cache is clear."); + } + catch(Exception ex) + { + MessageBox.Show(ex.Message); + } + } + } + + // export + private void button6_Click(object sender, RoutedEventArgs e) + { + MainMap.ShowExportDialog(); + } + + // import + private void button5_Click(object sender, RoutedEventArgs e) + { + MainMap.ShowImportDialog(); + } + + // use route cache + private void checkBoxCacheRoute_Checked(object sender, RoutedEventArgs e) + { + MainMap.Manager.UseRouteCache = checkBoxCacheRoute.IsChecked.Value; + } + + // use geocoding cahce + private void checkBoxGeoCache_Checked(object sender, RoutedEventArgs e) + { + MainMap.Manager.UseGeocoderCache = checkBoxGeoCache.IsChecked.Value; + MainMap.Manager.UsePlacemarkCache = MainMap.Manager.UseGeocoderCache; + } + + // save currnt view + private void button7_Click(object sender, RoutedEventArgs e) + { + try + { + ImageSource img = MainMap.ToImageSource(); + PngBitmapEncoder en = new PngBitmapEncoder(); + en.Frames.Add(BitmapFrame.Create(img as BitmapSource)); + + Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); + dlg.FileName = "GMap.NET Image"; // Default file name + dlg.DefaultExt = ".png"; // Default file extension + dlg.Filter = "Image (.png)|*.png"; // Filter files by extension + dlg.AddExtension = true; + dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); + + // Show save file dialog box + bool? result = dlg.ShowDialog(); + + // Process save file dialog box results + if(result == true) + { + // Save document + string filename = dlg.FileName; + + using(System.IO.Stream st = System.IO.File.OpenWrite(filename)) + { + en.Save(st); + } + } + } + catch(Exception ex) + { + MessageBox.Show(ex.Message); + } + } + + // clear all markers + private void button10_Click(object sender, RoutedEventArgs e) + { + var clear = MainMap.Markers.Where(p => p != null && p != currentMarker); + if(clear != null) + { + for(int i = 0; i < clear.Count(); i++) + { + MainMap.Markers.Remove(clear.ElementAt(i)); + i--; + } + } + + if(radioButtonPerformance.IsChecked == true) + { + tt = 0; + if(!timer.IsEnabled) + { + timer.Start(); + } + } + } + + // add marker + private void button8_Click(object sender, RoutedEventArgs e) + { + GMapMarker m = new GMapMarker(currentMarker.Position); + { + Placemark? p = null; + if(checkBoxPlace.IsChecked.Value) + { + GeoCoderStatusCode status; + var plret = GMapProviders.GoogleMap.GetPlacemark(currentMarker.Position, out status); + if(status == GeoCoderStatusCode.G_GEO_SUCCESS && plret != null) + { + p = plret; + } + } + + string ToolTipText; + if(p != null) + { + ToolTipText = p.Value.Address; + } + else + { + ToolTipText = currentMarker.Position.ToString(); + } + + m.Shape = new CustomMarkerDemo(this, m, ToolTipText); + m.ZIndex = 55; + } + MainMap.Markers.Add(m); + } + + // sets route start + private void button11_Click(object sender, RoutedEventArgs e) + { + start = currentMarker.Position; + } + + // sets route end + private void button9_Click(object sender, RoutedEventArgs e) + { + end = currentMarker.Position; + } + + // adds route + private void button12_Click(object sender, RoutedEventArgs e) + { + RoutingProvider rp = MainMap.MapProvider as RoutingProvider; + if(rp == null) + { + rp = GMapProviders.GoogleMap; // use google if provider does not implement routing + } + + MapRoute route = rp.GetRoute(start, end, false, false, (int)MainMap.Zoom); + if(route != null) + { + GMapMarker m1 = new GMapMarker(start); + m1.Shape = new CustomMarkerDemo(this, m1, "Start: " + route.Name); + + GMapMarker m2 = new GMapMarker(end); + m2.Shape = new CustomMarkerDemo(this, m2, "End: " + start.ToString()); + + GMapMarker mRoute = new GMapMarker(start); + { + mRoute.Route.AddRange(route.Points); + mRoute.RegenerateRouteShape(MainMap); + + mRoute.ZIndex = -1; + } + + MainMap.Markers.Add(m1); + MainMap.Markers.Add(m2); + MainMap.Markers.Add(mRoute); + + MainMap.ZoomAndCenterMarkers(null); + } + } + + // enables tile grid view + private void checkBox1_Checked(object sender, RoutedEventArgs e) + { + MainMap.ShowTileGridLines = true; + } + + // disables tile grid view + private void checkBox1_Unchecked(object sender, RoutedEventArgs e) + { + MainMap.ShowTileGridLines = false; + } + + private void Window_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) + { + int offset = 22; + + if(MainMap.IsFocused) + { + if(e.Key == Key.Left) + { + MainMap.Offset(-offset, 0); + } + else if(e.Key == Key.Right) + { + MainMap.Offset(offset, 0); + } + else if(e.Key == Key.Up) + { + MainMap.Offset(0, -offset); + } + else if(e.Key == Key.Down) + { + MainMap.Offset(0, offset); + } + else if(e.Key == Key.Add) + { + czuZoomUp_Click(null, null); + } + else if(e.Key == Key.Subtract) + { + czuZoomDown_Click(null, null); + } + } + } + + // set real time demo + private void realTimeChanged(object sender, RoutedEventArgs e) + { + MainMap.Markers.Clear(); + + // start performance test + if(radioButtonPerformance.IsChecked == true) + { + timer.Start(); + } + else + { + // stop performance test + timer.Stop(); + } + + // start realtime transport tracking demo + if(radioButtonTransport.IsChecked == true) + { + if(!transport.IsBusy) + { + firstLoadTrasport = true; + transport.RunWorkerAsync(); + } + } + else + { + if(transport.IsBusy) + { + transport.CancelAsync(); + } + } + } + + private void Window_PreviewKeyDown(object sender, KeyEventArgs e) + { + if(e.Key == Key.A) + { + MainMap.Bearing--; + } + else if(e.Key == Key.Z) + { + MainMap.Bearing++; + } + } + } + + public class MapValidationRule : ValidationRule + { + bool UserAcceptedLicenseOnce = false; + internal MainWindow Window; + + public override ValidationResult Validate(object value, CultureInfo cultureInfo) + { + if(!(value is OpenStreetMapProviderBase)) + { + if(!UserAcceptedLicenseOnce) + { + if(File.Exists(AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar + "License.txt")) + { + string ctn = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar + "License.txt"); + int li = ctn.IndexOf("License"); + string txt = ctn.Substring(li); + + var d = new Demo.WindowsPresentation.Windows.Message(); + d.richTextBox1.Text = txt; + + if(true == d.ShowDialog()) + { + UserAcceptedLicenseOnce = true; + if(Window != null) + { + Window.Title += " - license accepted by " + Environment.UserName + " at " + DateTime.Now; + } + } + } + else + { + // user deleted License.txt ;} + UserAcceptedLicenseOnce = true; + } + } + + if(!UserAcceptedLicenseOnce) + { + return new ValidationResult(false, "user do not accepted license ;/"); + } + } + + return new ValidationResult(true, null); + } + } +}