NavigationService выбрасывает AccessViolationException в C# на Windows Phone 8

Имейте в виду, я очень плохо знаком с программированием. Мне удалось настроить изображения в качестве пользовательских маркеров на картах Bing, изображения выбираются и помещаются на карту в соответствии с данными, поступающими из канала JSON. У меня есть страница просмотра списка, на которой можно просмотреть предупреждения о наводнениях, и, нажав на элемент в этом списке, вы перейдете на другую страницу с более подробной информацией об этом конкретном потоке. Я хочу, чтобы, когда кто-то нажимал на маркер на карте, он переходил на информационную страницу, соответствующую этому наводнению. (Это немного запутанно, но я надеюсь, что это понятно)

Мне было очень трудно заставить это работать, код для перехода от просмотра списка к информационной странице достаточно прост,

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.xaml.cs), в то время как код маркера отсутствует в файле cs страницы, с которой я осуществляю навигацию (в 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 называется. Есть идеи?

РЕДАКТИРОВАТЬ
Сейчас я выбрал более простое решение (используя CustomMessageBox, оно выполняет свою работу), но я все равно буду очень признателен за решение этого вопроса. Я понимаю, что это может быть невероятно специфической проблемой и, следовательно, может потребовать столь же конкретного ответа. Код немного запутан, но это из-за моей нехватки обучения или опыта.

1 ответ

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

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 в конструкторе.

ИЛИ если вы перемещаетесь из 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));
Другие вопросы по тегам