Hi,
I use ArcGIS Runtime for Net with Xamarin. Legend or LayerLegend controls work fine on UWP, but does not work correctly on Android. I can see layers in my application, but all features from all operational layers are hided. If I comment in xaml legend part I can see all features. When I add operational layer I set each layer to be visible in legend and visible itself.
I do not know is it possible to get checkboxes for visibility in legend controls. Maybe all my layer are invisible?
Are you using Xamarin.Forms? You might have to specify Height/WidthRequest. I just logged an issue for this.
<esri:MapView x:Name="MyMapView" Map="https://www.arcgis.com/home/webmap/viewer.html?webmap=f1ed0d220d6447a586203675ed5ac213"/>
<toolkit:Legend x:Name="MyLegend"
BindingContext="{x:Reference MyMapView}"
GeoView="{Binding}"
BackgroundColor="Black"
HeightRequest="200"
WidthRequest="200"
VerticalOptions="StartAndExpand"/>
If you are using Xamarin.Android, the following code should just work.
var layout = new LinearLayout(this)
{
Orientation = Orientation.Vertical,
LayoutParameters = new LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent),
};
var mapView = new MapView(this)
{
LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.WrapContent, 2f),
Map = new Map(new Uri("https://www.arcgis.com/home/webmap/viewer.html?webmap=f1ed0d220d6447a586203675ed5ac213"))
};
layout.AddView(mapView);
var legend = new Legend(this)
{
LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.WrapContent, 1f),
};
layout.AddView(legend);
legend.GeoView = mapView;
SetContentView(layout);
If you have set Legend.GeoView property before MapView.Map is set, you might be hitting this bug. What you can do is set Legend.GeoView later when map is ready.
LayerLegend only displays symbology and layer name for a given layer. Legend displays LayerLegend for layers contained in the GeoView.
If you are looking to control the visibility of layers/sub-layers, I think you need TableOfContents which is a toolkit currently only available in WPF. You can do something like...
<ListView ItemsSource="{Binding Path=Map.AllLayers}" BindingContext="{x:Reference MyMapView}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal">
<Switch IsToggled="{Binding IsVisible, Mode=TwoWay}"/>
<Label Text="{Binding Name}"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Hi Jenifer,
Thank you for your reply.
Yes, I am using Xamarin.Forms. Height/WidthRequest did not solve the problem.
I think that settings can influent legend view, but my problem is that I can’t see features on the MapView when I set legend.GeoView = mapView;
It seems that is the bug which you have mentioned, but I am using MVVM and do not know how to change sequence of map creation and GeoView setting.
I'm not able to reproduce even if I were to change MapView.Map to use MVVM
<Grid.Resources>
<local:MapSource x:Key="MapSource"/>
</Grid.Resources>
<esri:MapView x:Name="MyMapView" Map="{Binding Source={StaticResource MapSource}, Path=Map}"/>
I have not seen features disappearing when Legend.GeoView is set, can you share some code to reproduce?
For example, how do you do this? Can you check in your code where IsVisible is set anywhere?
When I add operational layer I set each layer to be visible in legend and visible itself.
You can check MyMapView.LayerViewStateChanged event and see LayerViewState.Status becomes OutOfScale or NotVisible.
MyMapView.SpatialReferenceChanged event could also be used to know if Map with layers has been set.
Hi,
I would like to share my code by pieces.
Xaml:
public Map Map
{
get {
if(_map == null)
{
_map = new Map(Basemap.CreateStreets());
AddLayers();
}
return _map;
}
set {
_map = value;
}
}
// Create uri to the used feature service
var serviceUri = new Uri("…");
// Create feature table for the pools feature service
ServiceFeatureTable sitesFeatureTable = new ServiceFeatureTable(serviceUri);
// Define the request mode
sitesFeatureTable.FeatureRequestMode = FeatureRequestMode.OnInteractionNoCache;
// Create FeatureLayer that uses the created table
FeatureLayer sitesFeatureLayer = new FeatureLayer(sitesFeatureTable);
sitesFeatureLayer.Name = "Sites";
sitesFeatureLayer.ShowInLegend = true;
sitesFeatureLayer.IsVisible = true;
// Add created layer to the map
_map.OperationalLayers.Add(sitesFeatureLayer);
I will try to check events you have mentioned and inform about results later.
Hi,
I have found problem location. I have loaded data from ArcGIS Runtime samples page
https://developers.arcgis.com/net/latest/wpf/api-reference/html/E_Esri_ArcGISRuntime_UI_Controls_GeoView_LayerViewStateChanged.htm
// Create Uri for feature layer
var featureLayerUri = new Uri(
"http://sampleserver6.arcgisonline.com/arcgis/rest/services/Recreation/FeatureServer/0");
// Create a feature layer using url
FeatureLayer myFeatureLayer = new FeatureLayer(featureLayerUri);
myFeatureLayer.Name = "Feature Layer";
// Add the feature layer to map
myMap.OperationalLayers.Add(myFeatureLayer);
// Create a map point the map should zoom to
MapPoint mapPoint = new MapPoint(-11000000, 4500000, SpatialReferences.WebMercator);
// Set the initial viewpoint for map
myMap.InitialViewpoint = new Viewpoint(mapPoint, 50000000);
It works without setting visibility for legend and for layer. I have commented my layer visibility setting code, but it not helped.
There are two differences how feature layer is created:
1. Different data source (ArcGIS server data and arcgisonline data)
2. I create FeatureLayer from ServiceFeatureTable, not directly from Uri.
I have tried create FeatureLayer directly from Uri, but it not works. So Legend control does not work with ArcGIS server data
Hi,
I have tried the legend control with .geodatabase package and it works fine. At this time I found only one type of data which do not wont to work with legend control is ArcGIS server data (FeatureServer)