2011-04-06 9 views
3

저는 실버 라이트/WPF 및 WP7 용으로 새로 개발되었지만, C#을 사용하여 콘솔이나 윈도우 폼을 개발하는 것에 익숙해졌습니다.GPS 감시자를 App.xaml 수퍼 클래스로 이동시키고 이벤트를 다른 페이지/클래스로 전송하는 방법은 무엇입니까?

Silverlight SDK와 Microsoft.Maps.MapControl 및 System.Device.Location 클래스를 사용하여 위치 인식 응용 프로그램을 만들려고합니다. 내가 겪고있는 문제는 다른 페이지에서 "감시자"에 액세스하는 것입니다. 이를 수행하는 가장 좋은 방법은 무엇입니까? 페이지 사이를 전환 할 때 UI 스레드에서 새 위치를 확인하지 않고 중복 작업을 수행하지 않도록 GUI 페이지 클래스 외부에 넣고 싶습니다.

다음은 어떻게해야하는지에 대한 개요입니다. 끝내십시오 (앱 수퍼 클래스로 GPS 감시자 이동 -> 이벤트 변경시 페이지 클래스에 대한 Dispatcher), 누군가 제발 저를 시정하십시오! 이 주요 문제는 인스턴스화 또는 정적 메서드없이 Page 클래스 (MainPage.xaml 및 ListView.xaml)에 액세스 할 수 없다는 것입니다. 페이지에서 정적 메서드를 만들면 어쨌든 (위치가 변경된 상태 막대를 설정하거나지도 뷰를 새 위치로 이동하는 등) 페이지와 상호 작용할 수 없으므로 쓸모가 없습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? App 클래스에서 새 정적 위치 객체를 설정하고 하위 클래스에서 액세스하는 것으로 생각했지만 수동 작업입니다. Dispatcher가이를 수행하는 방법 인 것처럼 보입니다.하지만 페이지를 참조 할 수있는 방법은 없습니다. 인스턴스화? 윈도우에서

내가 사용하는 앱 양식 - ... 여기

readonly FormClass form = (FormClass)Application.OpenForms["formname"]; 내 코드의 예입니다

App.xaml.cs를 (앱 클래스) - 분명히이 전체 WP7의 슈퍼 클래스입니다 그래서 여기에 내 감시자를 넣어. 이 Updated-

Public Partial Class App : Application 
{ 
Private IGeoPositionWatcher<GeoCoordinate> _watcher; 
    Public App() 
    { 
    //App constructor 
     //Mock GPS services on WP7 emulator 
      if (_watcher == null) 
      { 
       var events = new[] { 
        new GeoCoordinateEventMock { Latitude=33.43, Longitude=-112.02, Time=new TimeSpan(0,0,1) }, 
        }; 
       _watcher = new EventListGeoLocationMock(events); 
      } 
      //add event handlers for statuschanged and positionchanged 
      _watcher.StatusChanged += WatcherStatusChanged; 
      _watcher.PositionChanged += WatcherPositionChanged; 
      //start watcher 
      _watcher.Start(); 
    } 
#event handlers 
     public void WatcherStatusChanged(object sender, GeoPositionStatusChangedEventArgs e) 
     { 
      Deployment.Current.Dispatcher.BeginInvoke(() => MainPage.MyStatusChanged(e)); 
      Deployment.Current.Dispatcher.BeginInvoke(() => OtherPage.MyStatusChanged(e)); 
     } 
     public void WatcherPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) 
     { 
      Deployment.Current.Dispatcher.BeginInvoke(() => MainPage.MyPositionChanged(e)); 
      Deployment.Current.Dispatcher.BeginInvoke(() => OtherPage.MyPositionChanged(e)); 
     } 

} 

MainPage.xaml.cs (MainPage class)- 
public void MyPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e) 
{ 
//do some stuff 
} 
public void MyStatusChanged(GeoPositionStatusChangedEventArgs e) 
{ 
//do some stuff 
} 

내가 위치 -

public class Loc 
{ 

    private readonly GeoCoordinateWatcher _watcher; 
    public Location CurLoc { get; set; } 
    public string LocStatus { get; set; } 

    public Loc() 
    { 
     if (_watcher != null) return; 
     //---get the default accuracy- 

     _watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default) 


         { 
          MovementThreshold = 1000 
         }; 


     //add event handlers for statuschanged and positionchanged 
     _watcher.StatusChanged += WatcherStatusChanged; 
     _watcher.PositionChanged += WatcherPositionChanged; 

     //start watcher 
     _watcher.Start(); 
    } 

    private void MyPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e) 
    { 
     //called from the _watcher Position changed eventHandler 

      CurLoc = new Location(e.Position.Location.Latitude, e.Position.Location.Longitude); 



    } 

    private void MyStatusChanged(GeoPositionStatusChangedEventArgs e) 
    { 
     //called from the _watcher position status changed event handler 

     switch (e.Status) 
     { 
      case GeoPositionStatus.Disabled: 
       LocStatus = "Location services disabled!"; 

       break; 
      case GeoPositionStatus.Initializing: 
       LocStatus = "Finding current location..."; 

       break; 
      case GeoPositionStatus.NoData: 
       LocStatus = "No location data available..."; 

       break; 
      case GeoPositionStatus.Ready: 
       LocStatus = "Found you"; 

       break; 
     } 
    } 

    private void WatcherStatusChanged(object sender, GeoPositionStatusChangedEventArgs e) 
    { 
     Deployment.Current.Dispatcher.BeginInvoke(() => MyStatusChanged(e)); 
    } 

    private void WatcherPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) 
    { 
     Deployment.Current.Dispatcher.BeginInvoke(() => MyPositionChanged(e)); 

    } 
} 

가 그럼 난 내 응용 프로그램에서이 클래스의 인스턴스를 내을위한 공용 클래스 Loc 데이를 만든

을 needed- 나는대로 작동 그것을 가지고하는 방법입니다. xaml.cs 클래스를 정적 ​​객체로 사용하여 앱 작동 중에 정보를 활용할 수 있습니다.

public partial class App 
{ 
    /// <summary> 
    /// Provides easy access to the root frame of the Phone Application. 
    /// </summary> 
    /// <returns>The root frame of the Phone Application.</returns> 
    public PhoneApplicationFrame RootFrame { get; private set; } 

      public static Loc AppLoc = new Loc(); 

그런 다음 내 응용 프로그램 내부에 난 그냥 use-

App.AppLoc.CurLoc 또는 App.AppLoc.LocStatus 할 수있는 위치 정보에 액세스해야 할 때마다

답변

0

PhoneApplicationPage 메서드 OnNavigatedTo() 및 OnNavigatedFrom()을 사용하여 위치 수신을 등록/등록 취소합니다. Watcher 객체는 계획대로 Application 클래스에 정의 될 수 있습니다. 개별 페이지는 Application.Current라는 정적 속성을 사용하여 Application 개체에 액세스 할 수 있습니다.

나는 당신이 필요한 모든 것을 가지고 있다고 생각합니다.

사실 GeoCoordinateWatcher는 UI 스레드 컨텍스트에서 이벤트를 전달하기 때문에 이벤트 발송은 필요하지 않습니다.

사이드 말 : 우리 (Resco)가 방금 위치 라이브러리에 대한 업데이트를 게시했습니다. 어쩌면 this article은 GPS 및 위치 기반 서비스로 무엇을 할 수 있는지 몇 가지 아이디어를 줄 수 있습니다.

+0

감사합니다. 내가 말했듯이, 감시자를 앱 수퍼 클래스로 이동시킨 다음 정적 위치에 액세스하면 내 위치를 찾았습니다. 감사! – thebringking

0

당신은 메시징 시스템을 사용할 수있는 경우 위치 또는 상태가 변경됩니다. 모든 관련 페이지가 이러한 메시지에 가입 할 수 있습니다.

또는 앱의 구조에 따라 이벤트를 중앙에서 처리하고 다른 페이지에서 참조하는 공유보기 모델에 적용 할 수 있습니다.

관련 문제