2015-01-07 2 views
0

Помните, что я очень новичок в программировании. Мне удалось настроить изображения как пользовательские маркеры на бинговых картах, изображения выбраны и размещены на карте в соответствии с данными, поступающими из канала JSON. У меня есть страница просмотра списка, где можно просмотреть предупреждения о наводнениях, и нажатие на элемент в этом списке приведет вас к другой странице с подробной информацией об этом потоке. Я хочу, чтобы так, когда кто-то нажимает на маркер на карте, он доставит их на информационную страницу, соответствующую этому потоку. (Это немного сложно, но я надеюсь, что это понятно)NavigationService throwing AccessViolationException в C# на Windows Phone 8

У меня были большие трудности, чтобы получить эту работу, код для навигации из ListView на странице информации достаточно просто,

private void listBoxBeaches_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     GetSelectedItem(); 
    } 

private void GetSelectedItem() 
    { 
     RootObject item = listBoxBeaches.SelectedItem as RootObject; 

     ArDe = item.AreaDescription; 
     SeTe = item.SeverityTxt; 
     Rais = item.RaisedF; 
     MesEng = item.MessageEnglish; 
     MesCym = item.MessageWelsh; 

     if (item != null) 
     {  
     NavigationService.Navigate(new Uri(string.Format("/AlertInfoPage.xaml?area={0}&sev={1}&rais={2}&meseng={3}&mescym={4}",ArDe,SeTe,Rais,MesEng,MesCym) ,UriKind.Relative)); 
     } 
    } 

Но при попытке получить маркеры кликабельны, так что он переходит в том же месте было проблематично,

public string ArDe; 
    public string SeTe; 
    public string Rais; 
    public string MesEng; 
    public string MesCym; 
    public Grid marker; 
    public NavigationService navServ; 


    private Map myMap = new Map(); 

    private MapLayer mylayer = new MapLayer(); 

public Map SetMapPins(List<RootObject>FloodList) 
    { 
     myMap.LandmarksEnabled = true; 
     myMap.PedestrianFeaturesEnabled = true; 
     myMap.Center = new GeoCoordinate(52.44, -4); 
     myMap.ZoomLevel = 7.8; 
     myMap.CartographicMode = MapCartographicMode.Road; 

     foreach (var flood in FloodList) 
     { 
      //this grabs the marker graphic 
      marker = flood.GetGrid(); 

      MapOverlay myOverlay = new MapOverlay(); 

      myOverlay.GeoCoordinate = new GeoCoordinate(flood.Center.Latitude, flood.Center.Longitude); 

      string AreaDes = flood.AreaDescription; 
      string SeverityTxt = flood.SeverityTxt; 
      string Raised = flood.Raised; 
      string EngMessage = flood.MessageEnglish; 
      string CymMessage = flood.MessageWelsh; 
      marker.MouseLeftButtonUp += (sender, args) => Floodpic_MouseLeftButtonUp(null, null, AreaDes, SeverityTxt, Raised, EngMessage, CymMessage); 
      myOverlay.Content = marker; 

      mylayer.Add(myOverlay); 
     } 

     myMap.Layers.Add(mylayer); 


     return myMap; 
    } 

private void Floodpic_MouseLeftButtonUp(object sender, MouseButtonEventArgs e, string AreaDes, string SeverityTxt, string Raised, string EngMessage, string CymMessage) 
    { 
     GetSelectedMapItem(AreaDes, SeverityTxt, Raised, EngMessage, CymMessage); 
    } 

public void GetSelectedMapItem(string AreaDes, string SeverityTxt, string Raised, string EngMessage, string CymMessage) 
    { 
     ArDe = AreaDes; 
     SeTe = SeverityTxt; 
     Rais = Raised; 
     MesEng = EngMessage; 
     MesCym = CymMessage; 

     //initially I used NavigationService.Navigate(new Uri(string.Format("/AlertInfoPage.xaml?area={0}&sev={1}&rais={2}&meseng={3}&mescym={4}",ArDe,SeTe,Rais,MesEng,MesCym) ,UriKind.Relative)); 
     //but this gives me "An object reference is required for the non-static field method or property 'System.Windows.Navigation.NavigationService.Navigate(System.Uri)" error 
     Navigate(navServ, new Uri(string.Format("/AlertInfoPage.xaml?area={0}&sev={1}&rais={2}&meseng={3}&mescym={4}", ArDe, SeTe, Rais, MesEng, MesCym), UriKind.Relative)); 

    } 

public void Navigate(NavigationService s, Uri destination) 
    { 
     //This is where the AccessViolationException is thrown 
     s.Navigate(destination); 
    } 

Просто так ясно, код ListView в навигации от фактической страницы (списке следует ListView.xaml.cs), в то время как код маркера не находится в файле cs на странице I'm naviga ting from (в SetMap.cs, а не MapView.xaml.cs, где есть карта и маркеры), то есть он перемещается извне.

Так что я не уверен, что нужно сделать, чтобы пройти это, я создал метод Navigation из-за получения ссылки на объект требуется ошибка для

NavigationService.Navigate(new Uri(string.Format("/AlertInfoPage.xaml?area={0}&sev={1}&rais={2}&meseng={3}&mescym={4}",ArDe,SeTe,Rais,MesEng,MesCym) ,UriKind.Relative)); 

даже после попытки

this.NavigationService.Navigate(new Uri(string.Format("/AlertInfoPage.xaml?area={0}&sev={1}&rais={2}&meseng={3}&mescym={4}",ArDe,SeTe,Rais,MesEng,MesCym) ,UriKind.Relative)); 

Теперь я получаю обращение AccessViolationException, когда вызывается Navigate. Есть идеи?

EDIT
Я пошел на более простое решение сейчас (используя CustomMessageBox, он получает работу), но я до сих пор очень ценю решение этой проблемы. Я понимаю, что это может быть невероятно конкретная проблема, и поэтому может потребоваться не менее конкретный ответ. Код немного размят, но это связано с отсутствием обучения или опыта.

ответ

0

Попробуйте этот путь, если ваша страница находится на корне.

NavigationService.Navigate(new Uri(string.Format("~/AlertInfoPage.xaml?area={0}&sev={1}&rais={2}&meseng={3}&mescym={4}",ArDe,SeTe,Rais,MesEng,MesCym) ,UriKind.Relative)); 

вы не можете назвать NavigationService.Navigate в конструкторе.

OR если вы используете навигацию от usercontrol.

RootFrame.Navigate(new Uri(string.Format("~/AlertInfoPage.xaml?area={0}&sev={1}&rais={2}&meseng={3}&mescym={4}",ArDe,SeTe,Rais,MesEng,MesCym) ,UriKind.Relative)); 
+0

я получаю ту же ошибку, как я с 'NavigationService.Navigate (новый Uri (String.Format ("/AlertInfoPage.xaml? Области = {0} & SEV = {1} & Раис = {2} & meseng = {3} & mescym = {4} ", ArDe, SeTe, Rais, MesEng, MesCym), UriKind.Relative));' Я получаю "Ссылка на объект требуется для метода или свойства нестатического поля" System.Windows.Navigation.NavigationService.Navigate (System.Uri) " – Marushiru

+0

Символ' ~ '. Я думаю, что вы ошибаетесь –

+0

Да, в вопросе я заявляю, что я пробовал это без него. Добавление '~' дает мне ту же ошибку »Ссылка на объект требуется для метода или свойства нестатического поля« System.Windows.Navigation.NavigationService.Navigate (System.Uri) » – Marushiru