<esri:Map x:Name="MyMap" Background="White" WrapAround="true" IsLogoVisible="False" Loaded="MyMap_Loaded" Extent="959677,402707,1075561,470675" MouseClick="MyMap_MouseClick"> <esri:Map.Layers> <esri:ArcGISTiledMapServiceLayer ID="AGOLayer" Url="http://webaddress"/> <esri:ArcGISDynamicMapServiceLayer ID="Attendance Areas" Opacity=".5" Url="http://webaddress"/> <esri:ArcGISTiledMapServiceLayer ID="Labels" Url="http://webaddress"/> <esri:FeatureLayer ID="Schools" MouseEnter="FeatureLayer_MouseEnter" MouseLeave="FeatureLayer_MouseLeave" Url="webaddress" OutFields="SCHNAME, ADDRESS, PHONE, URL"/> <esri:FeatureLayer ID="Schools Without Attendance Areas" MouseEnter="FeatureLayer_MouseEnter" MouseLeave="FeatureLayer_MouseLeave" Visible="False" Url="http://webaddress" OutFields="SCHNAME, ADDRESS, PHONE, URL"/> <esri:GraphicsLayer ID="ResultsGraphicsLayer"/> <esri:GraphicsLayer ID="MyGraphicsLayer"/> <esri:GraphicsLayer ID="IdentifyIconGraphicsLayer"/> <esri:GraphicsLayer ID="AddressToLocationGraphicsLayer"> <esri:GraphicsLayer.MapTip> <Grid Background="LightYellow"> <StackPanel Margin="5" > <TextBlock Text="{Binding [Address]}" HorizontalAlignment="Left" /> <TextBlock Text="{Binding [LatLon]}" HorizontalAlignment="Left" /> </StackPanel> <Border BorderBrush="Black" BorderThickness="1" /> </Grid> </esri:GraphicsLayer.MapTip> </esri:GraphicsLayer> </esri:Map.Layers> </esri:Map> <Style TargetType="esri:Legend"> <Setter Property="LayerItemsMode" Value="Flat" /> <Setter Property="LayerTemplate"> <Setter.Value> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox Content="{Binding Label}" IsChecked="{Binding IsEnabled, Mode=TwoWay}" IsEnabled="{Binding IsInScaleRange}" > </CheckBox> </StackPanel> </DataTemplate> </Setter.Value> </Setter> <Setter Property="MapLayerTemplate"> <Setter.Value> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox Content="{Binding Label}" IsChecked="{Binding IsEnabled, Mode=TwoWay}" IsEnabled="{Binding IsInScaleRange}" > </CheckBox> </StackPanel> </DataTemplate> </Setter.Value> </Setter> </Style> private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e) { LayerItemViewModel removeLayerItemVM = null; if (e.LayerItem.Layer is ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer) e.LayerItem.LayerItems = null; if (e.LayerItem.LayerItems != null) { foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems) { if (layerItemVM.IsExpanded) layerItemVM.IsExpanded = false; } if (removeLayerItemVM != null) e.LayerItem.LayerItems.Remove(removeLayerItemVM); } else { e.LayerItem.IsExpanded = false; } }
Solved! Go to Solution.
<userControls:DraggableWindow IsOpen="True" x:Name="MapLegendWindow" Margin="0,5,10,0" HorizontalAlignment="Right" Width="311" Padding="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Title="Map Legend" Background="{StaticResource BaseColor}" VerticalAlignment="Top" Height="425"> <i:Interaction.Triggers> <i:EventTrigger> <!--<actions:ToggleWindowVisibilityAction />--> <!-- Hide at startup --> </i:EventTrigger> </i:Interaction.Triggers> <esri:Legend x:Name="Legend" Map="{Binding ElementName=MyMap}" LayerIDs="Labels, Public Schools, Non-Public Schools, Attendance Areas" LayerItemsMode="Flat" ShowOnlyVisibleLayers="False" Refreshed="Legend_Refreshed" > <esri:Legend.MapLayerTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox Content="{Binding Label}" IsChecked="{Binding IsEnabled, Mode=TwoWay}" IsEnabled="{Binding IsInScaleRange}" /> </StackPanel> </DataTemplate> </esri:Legend.MapLayerTemplate> <esri:Legend.LayerTemplate> <DataTemplate> <RadioButton Content="{Binding Label}" Background="#01FFFFFF" Foreground="Black" IsChecked="{Binding IsEnabled, Mode=TwoWay}" IsEnabled="{Binding IsInScaleRange}" /> </DataTemplate> </esri:Legend.LayerTemplate> </esri:Legend> </userControls:DraggableWindow> private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e) { LayerItemViewModel removeLayerItemVM = null; if (e.LayerItem.Layer is ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer) e.LayerItem.LayerItems = null; if (e.LayerItem.LayerItems != null) { foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems) { if (layerItemVM.IsExpanded) layerItemVM.IsExpanded = false; } if (removeLayerItemVM != null) e.LayerItem.LayerItems.Remove(removeLayerItemVM); } else { e.LayerItem.IsExpanded = true; } } <RadioButton x:Name="rbLayer"
GroupName="AttendanceAreaLayers"
IsChecked="{Binding DefaultVisibility}"
DataContext="{Binding ElementName=Legend}"
Content="{Binding Label}"
Background="#01FFFFFF">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="{Binding RadioButtonCheckedCommand}"
CommandParameter="{Binding ElementName=rbLayer}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</RadioButton> private void RadioButtonCheckedCommand(object sender, RoutedEventArgs e)
{
RadioButton tickedCheckBox = sender as RadioButton;
string serviceName = tickedCheckBox.Name;
bool visible = (bool)tickedCheckBox.IsChecked;
int layerIndex = (int)tickedCheckBox.Tag;
ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer dynamicServiceLayer = MyMap.Layers[serviceName] as ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer;
dynamicServiceLayer.VisibleLayers = new int[] { layerIndex };
}
<!-- Map legend window -->
<userControls:DraggableWindow IsOpen="True" x:Name="MapLegendWindow" Margin="0,5,10,0"
HorizontalAlignment="Right" Width="311" Padding="0"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
Title="Map Legend" Background="{StaticResource BaseColor}"
VerticalAlignment="Top" Height="335">
<i:Interaction.Triggers>
<i:EventTrigger>
<!--<actions:ToggleWindowVisibilityAction />--> <!-- Hide at startup -->
</i:EventTrigger>
</i:Interaction.Triggers>
<StackPanel HorizontalAlignment="Right" VerticalAlignment="Center" Orientation="Vertical" Width="262">
<esri:Legend x:Name="Legend" Map="{Binding ElementName=MyMap}"
LayerIDs="Labels, Public Schools, Non-Public Schools"
LayerItemsMode="Flat"
ShowOnlyVisibleLayers="False"
Refreshed="Legend_Refreshed" />
<RadioButton x:Name="ElementarySchoolAttendanceAreas"
Tag="website/MapServer/0"
IsChecked="true" Margin="5,0,0,0" Foreground="White"
GroupName="LegendLayers" Content="Elementary School Attendance Areas" Click="LegendRadioButton_Click"/>
<RadioButton x:Name="MiddleSchoolAttendanceAreas"
Tag="website/MapServer/1"
IsChecked="true" Margin="5,0,0,0" Foreground="White"
GroupName="LegendLayers" Content="Middle School Attendance Areas" Click="LegendRadioButton_Click"/>
<RadioButton x:Name="HighSchoolAttendanceAreas"
Tag="website/MapServer/2"
IsChecked="true" Margin="5,0,0,0" Foreground="White"
GroupName="LegendLayers" Content="High School Attendance Areas" Click="LegendRadioButton_Click"/>
</StackPanel>
</userControls:DraggableWindow> private void LegendRadioButton_Click(object sender, RoutedEventArgs e)
{
ArcGISDynamicMapServiceLayer arcgisLayer = MyMap.Layers["Elementary School Attendance Area"] as ArcGISDynamicMapServiceLayer;
arcgisLayer.Url = ((RadioButton)sender).Tag as string;
}
<Style TargetType="esri:Legend">
<Setter Property="LayerItemsMode" Value="Flat" />
<Setter Property="LayerTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<RadioButton Name="DynamicLayerAttendanceArea"
GroupName="DynamicLayerAttendanceAreas"
Content="{Binding Name}"
IsChecked="{Binding DefaultVisibility}"
Tag="{Binding ID}"
ClickMode="Press"
Click="LegendRb_Click"
Background="#01FFFFFF">
</RadioButton>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="MapLayerTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Content="{Binding Label}"
IsChecked="{Binding IsEnabled, Mode=TwoWay}"
IsEnabled="{Binding IsInScaleRange}" >
</CheckBox>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style> private void LegendRb_Click(object sender, RoutedEventArgs e)
{
RadioButton tickedCheckBox = sender as RadioButton;
string serviceName = tickedCheckBox.Name;
bool visible = (bool)tickedCheckBox.IsChecked;
int layerIndex = (int)tickedCheckBox.Tag;
ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer dynamicServiceLayer = MyMap.Layers[serviceName] as ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer;
dynamicServiceLayer.VisibleLayers = new int[] { layerIndex };
}Well I just made an attempt to try to force radio buttons into the legend (see code below) and got the following error:
Line: 56
Error: Unhandled Error in Silverlight Application
Code: 4004
Category: ManagedRuntimeError
Message: System.ArgumentException: Service URL does not contain any layer.
at ESRI.ArcGIS.Client.Layer.OnInitializationFailed(EventArgs e)
at ESRI.ArcGIS.Client.Layer.Initialize()
at ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer.<>n__FabricatedMethod16()
at ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer.<>c__DisplayClass14.<MapServiceInfoInitFailed>b__12()
<RadioButton x:Name="ElementarySchoolAttendanceAreas"
string serviceName = tickedCheckBox.Name;
ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer dynamicServiceLayer = MyMap.Layers[serviceName] as ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer;
<esri:ArcGISDynamicMapServiceLayer ID="Attendance Areas"
dynamicServiceLayer.VisibleLayers = new int[] { layerIndex };
<userControls:DraggableWindow IsOpen="True" x:Name="MapLegendWindow" Margin="0,5,10,0" HorizontalAlignment="Right" Width="311" Padding="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Title="Map Legend" Background="{StaticResource BaseColor}" VerticalAlignment="Top" Height="425"> <i:Interaction.Triggers> <i:EventTrigger> <!--<actions:ToggleWindowVisibilityAction />--> <!-- Hide at startup --> </i:EventTrigger> </i:Interaction.Triggers> <esri:Legend x:Name="Legend" Map="{Binding ElementName=MyMap}" LayerIDs="Labels, Public Schools, Non-Public Schools, Attendance Areas" LayerItemsMode="Flat" ShowOnlyVisibleLayers="False" Refreshed="Legend_Refreshed" > <esri:Legend.MapLayerTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox Content="{Binding Label}" IsChecked="{Binding IsEnabled, Mode=TwoWay}" IsEnabled="{Binding IsInScaleRange}" /> </StackPanel> </DataTemplate> </esri:Legend.MapLayerTemplate> <esri:Legend.LayerTemplate> <DataTemplate> <RadioButton Content="{Binding Label}" Background="#01FFFFFF" Foreground="Black" IsChecked="{Binding IsEnabled, Mode=TwoWay}" IsEnabled="{Binding IsInScaleRange}" /> </DataTemplate> </esri:Legend.LayerTemplate> </esri:Legend> </userControls:DraggableWindow> private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e) { LayerItemViewModel removeLayerItemVM = null; if (e.LayerItem.Layer is ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer) e.LayerItem.LayerItems = null; if (e.LayerItem.LayerItems != null) { foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems) { if (layerItemVM.IsExpanded) layerItemVM.IsExpanded = false; } if (removeLayerItemVM != null) e.LayerItem.LayerItems.Remove(removeLayerItemVM); } else { e.LayerItem.IsExpanded = true; } }
1. Even though one of the radio buttons is on when I start the app, none of the layers show until I click a different layer in the group then I can get them all to show
<esri:Map x:Name="MyMap" Background="White" WrapAround="true" IsLogoVisible="False" Loaded="MyMap_Loaded" Extent="959677,402707,1075561,470675"
MouseClick="MyMap_MouseClick">
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="AGOLayer"
Url="website address"/>
<esri:ArcGISDynamicMapServiceLayer ID="Attendance Areas"
Opacity=".4"
Url="website address"
VisibleLayers="0"/>
<esri:ArcGISTiledMapServiceLayer ID="Labels"
Url="website address"/>
<esri:FeatureLayer ID="Public Schools"
MouseEnter="FeatureLayer_MouseEnter"
MouseLeave="FeatureLayer_MouseLeave"
Url="website address"
OutFields="SCHNAME, ADDRESS, PHONE, URL">
<esri:FeatureLayer.MapTip>
<Border CornerRadius="10" BorderBrush="#FF51626F" BorderThickness="2" Margin="0,0,15,15" Background="LightGray">
<StackPanel Margin="7">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding [SCHNAME]}" Foreground="Black" FontWeight="Bold"/>
<TextBlock Text="(Click point for more information) " Foreground="Black"/>
</StackPanel>
</StackPanel>
</Border>
</esri:FeatureLayer.MapTip>
</esri:FeatureLayer>
<esri:FeatureLayer ID="Non-Public Schools"
MouseEnter="FeatureLayer_MouseEnter"
MouseLeave="FeatureLayer_MouseLeave"
Visible="False"
Url="website address"
OutFields="SCHNAME, ADDRESS, PHONE, URL">
<esri:FeatureLayer.MapTip>
<Border CornerRadius="10" BorderBrush="#FF51626F" BorderThickness="2" Margin="0,0,15,15" Background="LightGray">
<StackPanel Margin="7">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding [SCHNAME]}" Foreground="Black" FontWeight="Bold"/>
<TextBlock Text="(Click point for more information) " Foreground="Black"/>
</StackPanel>
</StackPanel>
</Border>
</esri:FeatureLayer.MapTip>
</esri:FeatureLayer>
<esri:GraphicsLayer ID="ResultsGraphicsLayer"/>
<esri:GraphicsLayer ID="MyGraphicsLayer"/>
<esri:GraphicsLayer ID="IdentifyIconGraphicsLayer"/>
<esri:GraphicsLayer ID="AddressToLocationGraphicsLayer">
<esri:GraphicsLayer.MapTip>
<Grid Background="LightGray">
<StackPanel Margin="5" >
<TextBlock Text="{Binding [Address]}" HorizontalAlignment="Left" />
</StackPanel>
<Border BorderBrush="#FF51626F" BorderThickness="1" />
</Grid>
</esri:GraphicsLayer.MapTip>
</esri:GraphicsLayer>
</esri:Map.Layers>
</esri:Map>
Ok - this is what I have now (See below for code) that works mostly except for 2 issues.
1. Even though one of the radio buttons is on when I start the app, none of the layers show until I click a different layer in the group then I can get them all to show
2. I would like to have the option of having them all turned off
I removed all the App.xaml code that referred to the legend and all code behind for the radio buttons (but I kept the Legend refreshed)
MainPage.xaml:<userControls:DraggableWindow IsOpen="True" x:Name="MapLegendWindow" Margin="0,5,10,0" HorizontalAlignment="Right" Width="311" Padding="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Title="Map Legend" Background="{StaticResource BaseColor}" VerticalAlignment="Top" Height="425"> <i:Interaction.Triggers> <i:EventTrigger> <!--<actions:ToggleWindowVisibilityAction />--> <!-- Hide at startup --> </i:EventTrigger> </i:Interaction.Triggers> <esri:Legend x:Name="Legend" Map="{Binding ElementName=MyMap}" LayerIDs="Labels, Public Schools, Non-Public Schools, Attendance Areas" LayerItemsMode="Flat" ShowOnlyVisibleLayers="False" Refreshed="Legend_Refreshed" > <esri:Legend.MapLayerTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox Content="{Binding Label}" IsChecked="{Binding IsEnabled, Mode=TwoWay}" IsEnabled="{Binding IsInScaleRange}" /> </StackPanel> </DataTemplate> </esri:Legend.MapLayerTemplate> <esri:Legend.LayerTemplate> <DataTemplate> <RadioButton Content="{Binding Label}" Background="#01FFFFFF" Foreground="Black" IsChecked="{Binding IsEnabled, Mode=TwoWay}" IsEnabled="{Binding IsInScaleRange}" /> </DataTemplate> </esri:Legend.LayerTemplate> </esri:Legend> </userControls:DraggableWindow>
MainPage.xaml.cs:private void Legend_Refreshed(object sender, Legend.RefreshedEventArgs e) { LayerItemViewModel removeLayerItemVM = null; if (e.LayerItem.Layer is ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer) e.LayerItem.LayerItems = null; if (e.LayerItem.LayerItems != null) { foreach (LayerItemViewModel layerItemVM in e.LayerItem.LayerItems) { if (layerItemVM.IsExpanded) layerItemVM.IsExpanded = false; } if (removeLayerItemVM != null) e.LayerItem.LayerItems.Remove(removeLayerItemVM); } else { e.LayerItem.IsExpanded = true; } }
I found out the reason behind this one but I don't know how to fix it. I have 2 tiled map service layers in addition to my dynamic layer and a couple feature layers. When I comment out the tiled map service layer for the labels the dynamic layer is on a start up; when I bring it back it causes the problem again...it also doesn't seem what order I have it in my map layers - I tried it before and after the dynamic layer used for the radio button but I have the same results. Any clue on how to fix this?
(I am still trying to figure out how to be able to all the layers turned off by the user.)
MainPage.xaml code for the map layers:<esri:Map x:Name="MyMap" Background="White" WrapAround="true" IsLogoVisible="False" Loaded="MyMap_Loaded" Extent="959677,402707,1075561,470675" MouseClick="MyMap_MouseClick"> <esri:Map.Layers> <esri:ArcGISTiledMapServiceLayer ID="AGOLayer" Url="website address"/> <esri:ArcGISDynamicMapServiceLayer ID="Attendance Areas" Opacity=".4" Url="website address" VisibleLayers="0"/> <esri:ArcGISTiledMapServiceLayer ID="Labels" Url="website address"/> <esri:FeatureLayer ID="Public Schools" MouseEnter="FeatureLayer_MouseEnter" MouseLeave="FeatureLayer_MouseLeave" Url="website address" OutFields="SCHNAME, ADDRESS, PHONE, URL"> <esri:FeatureLayer.MapTip> <Border CornerRadius="10" BorderBrush="#FF51626F" BorderThickness="2" Margin="0,0,15,15" Background="LightGray"> <StackPanel Margin="7"> <StackPanel Orientation="Vertical"> <TextBlock Text="{Binding [SCHNAME]}" Foreground="Black" FontWeight="Bold"/> <TextBlock Text="(Click point for more information) " Foreground="Black"/> </StackPanel> </StackPanel> </Border> </esri:FeatureLayer.MapTip> </esri:FeatureLayer> <esri:FeatureLayer ID="Non-Public Schools" MouseEnter="FeatureLayer_MouseEnter" MouseLeave="FeatureLayer_MouseLeave" Visible="False" Url="website address" OutFields="SCHNAME, ADDRESS, PHONE, URL"> <esri:FeatureLayer.MapTip> <Border CornerRadius="10" BorderBrush="#FF51626F" BorderThickness="2" Margin="0,0,15,15" Background="LightGray"> <StackPanel Margin="7"> <StackPanel Orientation="Vertical"> <TextBlock Text="{Binding [SCHNAME]}" Foreground="Black" FontWeight="Bold"/> <TextBlock Text="(Click point for more information) " Foreground="Black"/> </StackPanel> </StackPanel> </Border> </esri:FeatureLayer.MapTip> </esri:FeatureLayer> <esri:GraphicsLayer ID="ResultsGraphicsLayer"/> <esri:GraphicsLayer ID="MyGraphicsLayer"/> <esri:GraphicsLayer ID="IdentifyIconGraphicsLayer"/> <esri:GraphicsLayer ID="AddressToLocationGraphicsLayer"> <esri:GraphicsLayer.MapTip> <Grid Background="LightGray"> <StackPanel Margin="5" > <TextBlock Text="{Binding [Address]}" HorizontalAlignment="Left" /> </StackPanel> <Border BorderBrush="#FF51626F" BorderThickness="1" /> </Grid> </esri:GraphicsLayer.MapTip> </esri:GraphicsLayer> </esri:Map.Layers> </esri:Map>