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));