저는 실버 라이트/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 할 수있는 위치 정보에 액세스해야 할 때마다
감사합니다. 내가 말했듯이, 감시자를 앱 수퍼 클래스로 이동시킨 다음 정적 위치에 액세스하면 내 위치를 찾았습니다. 감사! – thebringking