WorldGlobe.xaml.cs
上传用户:huazai0421
上传日期:2008-05-30
资源大小:405k
文件大小:3k
源码类别:

SilverLight

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Documents;
  8. using System.Windows.Input;
  9. using System.Windows.Media;
  10. using System.Windows.Media.Animation;
  11. using System.Windows.Shapes;
  12. using SilverGlobe.Data;
  13. using System.Windows.Threading;
  14. using ESRI.ArcGIS.Client.Geometry;
  15. namespace SilverGlobe
  16. {
  17. /// <summary>
  18. /// Globe linked to map
  19. /// </summary>
  20. public partial class WorldGlobe : UserControl
  21. {
  22. private DispatcherTimer _timer;
  23. private RotationController _rotationController;
  24. private SlerpController _slerpController;
  25. public WorldGlobe()
  26. {
  27. InitializeComponent();
  28. InitShapes();
  29. this.Loaded += new RoutedEventHandler(WorldGlobe_Loaded);
  30. }
  31. private void WorldGlobe_Loaded(object sender, RoutedEventArgs e)
  32. {
  33. //SubscribeEvents();
  34. _timer = new DispatcherTimer();
  35. _timer.Tick += Timer_Tick;
  36. _timer.Interval = TimeSpan.FromMilliseconds(10);
  37. _rotationController = new RotationController(_globe, _timer);
  38. _slerpController = new SlerpController(_globe);
  39. }
  40. /// <summary>
  41. ///  Internal handler for setting orientation of globe when map extent changes
  42. /// </summary>
  43. private void Map_ExtentChanged(object sender, ESRI.ArcGIS.Client.ExtentEventArgs args)
  44. {
  45. MapPoint center = Map.Extent.GetCenter();
  46. if (center.Y < -90) center.Y = -90;
  47. else if (center.Y > 90) center.Y = 90;
  48. SetViewCenter(new GeoPosition(center.Y, center.X));
  49. }
  50. public void SetViewCenter(GeoPosition position)
  51. {
  52. if (!_timer.IsEnabled)
  53. _timer.Start();
  54. _rotationController.AnimateTo(position);
  55. }
  56. private void Timer_Tick(Object sender, EventArgs e)
  57. {
  58. _globe.Update();
  59. _rotationController.Update();
  60. }
  61. private void InitShapes()
  62. {
  63. _globe.InitShapes(ContinentShapes.Africa,
  64.   ContinentShapes.America,
  65.   ContinentShapes.Australia,
  66.   ContinentShapes.Eurasia,
  67.   ContinentShapes.Antarctica
  68.   );
  69. }
  70. /// <summary>
  71. /// Identifies the <see cref="Map"/> dependency property.
  72. /// </summary>
  73. public static readonly DependencyProperty MapProperty =
  74. DependencyProperty.Register("Map", typeof(ESRI.ArcGIS.Client.Map), typeof(WorldGlobe),
  75. new PropertyMetadata(null, OnMapPropertyChanged));
  76. /// <summary>
  77. /// Gets or sets Map.
  78. /// </summary>
  79. public ESRI.ArcGIS.Client.Map Map
  80. {
  81. get { return (ESRI.ArcGIS.Client.Map)GetValue(MapProperty); }
  82. set { SetValue(MapProperty, value); }
  83. }
  84. /// <summary>
  85. /// MapProperty property changed handler. 
  86. /// </summary>
  87. /// <param name="d">WorldGlobe that changed its Map.</param>
  88. /// <param name="e">DependencyPropertyChangedEventArgs.</param> 
  89. private static void OnMapPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  90. {
  91. WorldGlobe dp = d as WorldGlobe;
  92. ESRI.ArcGIS.Client.Map newMap = (ESRI.ArcGIS.Client.Map)e.NewValue;
  93. ESRI.ArcGIS.Client.Map oldMap = (ESRI.ArcGIS.Client.Map)e.OldValue;
  94. if (oldMap != null)
  95. {
  96. oldMap.ExtentChanged -= dp.Map_ExtentChanged;
  97. if (newMap != null)
  98. {
  99. newMap.ExtentChanged += dp.Map_ExtentChanged;
  100. }
  101. }
  102. }
  103. }