ARCGis Xamarin - 导航到新页面后显示上一页的 MapView
ARCGis Xamarin - MapView from previous page displays after navigating to new page
我有一个 'main' 地图页面,用户可以从中向地图添加数据或单击现有数据以查看详细信息。这是通过 PushModalAsync() 完成的,我在其中导航到一个新页面。我的问题是在这两个新页面中,我有一个新地图和一个新 MapView,它是 'main' 页面中的 MapView 'underneath'。 MapView和Map本身都是二级页面上的新对象。
导航到我的新页面后,以前的 MapView 显示在它所在的屏幕区域(在 'main' 页面上),我的新 MapView 也存在于该区域。换句话说,在我的新地图页面上,我的地图布局与 'main' 地图不同,并且部分位置在布局中高于 'main' 地图。位置较高的部分是新地图中唯一可见且我可以与之交互的部分。位于同一区域的部分是 'main' 地图视图,我无法与之交互,它挡住了我的新地图。
我也用 PushAsync 尝试过这个(不是模态),但没有任何改变。如何在跨多个页面的应用程序中拥有多张地图? ArcGIS 甚至可以做到这一点吗?这个应用程序曾经与 Google Maps/Apple 一起使用,完全相同的布局工作得很好。
编辑:此处的代码(删除了不相关的部分) 此页面是从另一个带有地图的页面导航到的,如果该地图位于第一张地图的同一区域,则该地图将被覆盖。从这个页面,我导航到第三页,其中显示了两个地图。删除工作成功,但是当我尝试添加时出现错误,提示我无法将空子项添加到视图组:
public partial class EventDetails : ContentPage
{
public Xamarin.Forms.Grid MapGrid = new Xamarin.Forms.Grid()
{
RowDefinitions =
{
new RowDefinition { Height = 220 },
new RowDefinition { Height = GridLength.Auto }
},
ColumnDefinitions =
{
new ColumnDefinition { Width = 500 }
},
HorizontalOptions = LayoutOptions.Center
};
public Map DetailMap;
public MapView MyDetailMapView = new MapView();
public EventDetails(MapLog eventDetails, string strMapType)
{
DetailMap = new Map(BasemapType.ImageryWithLabels, eventDetails.Latitude, eventDetails.Longitude, iMapDetail);
MyDetailMapView.Map = DetailMap;
MyDetailMapView.ViewpointChanged += MyMapView_ViewpointChanged;
var scrollView = new ScrollView
{
Content = mainStack
};
MapGrid.Children.Add(MyDetailMapView, 0, 0);
MapGrid.Children.Add(scrollView, 0, 1);
Content = MapGrid;
}
#if __ANDROID__
protected override void OnAppearing()
{
if (!MapGrid.Children.Contains(MyDetailMapView))
{
try
{
MapGrid.Children.Add(MyDetailMapView);
}
catch (Exception ex)
{
DisplayAlert("Err", ex.Message, "Ok");
}
}
base.OnAppearing();
}
protected override void OnDisappearing()
{
if (MapGrid.Children.Contains(MyDetailMapView))
MapGrid.Children.Remove(MyDetailMapView);
base.OnDisappearing();
}
#endif
}
编辑*:我更新了我的 Xamarin Forms 版本和 ARCGIS 运行时,现在 remove/add 地图的解决方案确实可以正常工作。
我在 Xamarin Forms ArcGIS 中有两个 android 的地图时遇到了其他类似的问题,解决方案是在您导航到新页面时从可视化树中删除 MapView。
在导航到第二页之前,您需要删除 MapView:
[your parent layout].Children.Remove(MyMapView);
await Navigation.PushAsync(new SecondPage());
并且在您的第一个页面中,您需要确保在返回页面时将 MapView 添加回可视化树:
protected override void OnAppearing()
{
if (!GridMap.Children.Contains(MyMapView))
GridMap.Children.Add(MyMapView);
base.OnAppearing();
}
用两张地图解决了我所有的问题。感谢 ESRI 论坛中的 post
Navigation between 2 MapViews in Xamarin Android
我有一个 'main' 地图页面,用户可以从中向地图添加数据或单击现有数据以查看详细信息。这是通过 PushModalAsync() 完成的,我在其中导航到一个新页面。我的问题是在这两个新页面中,我有一个新地图和一个新 MapView,它是 'main' 页面中的 MapView 'underneath'。 MapView和Map本身都是二级页面上的新对象。
导航到我的新页面后,以前的 MapView 显示在它所在的屏幕区域(在 'main' 页面上),我的新 MapView 也存在于该区域。换句话说,在我的新地图页面上,我的地图布局与 'main' 地图不同,并且部分位置在布局中高于 'main' 地图。位置较高的部分是新地图中唯一可见且我可以与之交互的部分。位于同一区域的部分是 'main' 地图视图,我无法与之交互,它挡住了我的新地图。
我也用 PushAsync 尝试过这个(不是模态),但没有任何改变。如何在跨多个页面的应用程序中拥有多张地图? ArcGIS 甚至可以做到这一点吗?这个应用程序曾经与 Google Maps/Apple 一起使用,完全相同的布局工作得很好。
编辑:此处的代码(删除了不相关的部分) 此页面是从另一个带有地图的页面导航到的,如果该地图位于第一张地图的同一区域,则该地图将被覆盖。从这个页面,我导航到第三页,其中显示了两个地图。删除工作成功,但是当我尝试添加时出现错误,提示我无法将空子项添加到视图组:
public partial class EventDetails : ContentPage
{
public Xamarin.Forms.Grid MapGrid = new Xamarin.Forms.Grid()
{
RowDefinitions =
{
new RowDefinition { Height = 220 },
new RowDefinition { Height = GridLength.Auto }
},
ColumnDefinitions =
{
new ColumnDefinition { Width = 500 }
},
HorizontalOptions = LayoutOptions.Center
};
public Map DetailMap;
public MapView MyDetailMapView = new MapView();
public EventDetails(MapLog eventDetails, string strMapType)
{
DetailMap = new Map(BasemapType.ImageryWithLabels, eventDetails.Latitude, eventDetails.Longitude, iMapDetail);
MyDetailMapView.Map = DetailMap;
MyDetailMapView.ViewpointChanged += MyMapView_ViewpointChanged;
var scrollView = new ScrollView
{
Content = mainStack
};
MapGrid.Children.Add(MyDetailMapView, 0, 0);
MapGrid.Children.Add(scrollView, 0, 1);
Content = MapGrid;
}
#if __ANDROID__
protected override void OnAppearing()
{
if (!MapGrid.Children.Contains(MyDetailMapView))
{
try
{
MapGrid.Children.Add(MyDetailMapView);
}
catch (Exception ex)
{
DisplayAlert("Err", ex.Message, "Ok");
}
}
base.OnAppearing();
}
protected override void OnDisappearing()
{
if (MapGrid.Children.Contains(MyDetailMapView))
MapGrid.Children.Remove(MyDetailMapView);
base.OnDisappearing();
}
#endif
}
编辑*:我更新了我的 Xamarin Forms 版本和 ARCGIS 运行时,现在 remove/add 地图的解决方案确实可以正常工作。
我在 Xamarin Forms ArcGIS 中有两个 android 的地图时遇到了其他类似的问题,解决方案是在您导航到新页面时从可视化树中删除 MapView。
在导航到第二页之前,您需要删除 MapView:
[your parent layout].Children.Remove(MyMapView);
await Navigation.PushAsync(new SecondPage());
并且在您的第一个页面中,您需要确保在返回页面时将 MapView 添加回可视化树:
protected override void OnAppearing()
{
if (!GridMap.Children.Contains(MyMapView))
GridMap.Children.Add(MyMapView);
base.OnAppearing();
}
用两张地图解决了我所有的问题。感谢 ESRI 论坛中的 post Navigation between 2 MapViews in Xamarin Android