My code changes had no effect (positive or negative) which makes me think that this method (clonelayer) is not being called in my scenario. Is that possible based on my setup according to the readme file?
// For graphics layer, a clone of the graphic collection is done and is frozen // No web requests will be done private static Layer CloneLayer(Layer layer) { Layer toLayer; if (layer is GraphicsLayer) // Include FeatureLayer and GeoRSS layers { var fromLayer = layer as GraphicsLayer; var printLayer = new GraphicsLayer(); ............
This is done by using the IsActive property of the MapPrinter. The map is cloned for printing when the IsActive property is set to true (and the cloned map is freed when IsActive is set to false).So binding the IsActive property to the visibility of the preview window allows to take care of all changes when the preview window is opened and to free the resources when it's closed. Merry Christmas:).
private void printMap_Click(object sender, RoutedEventArgs e) { int y = printGrid.Children.Count; if (y < 1) { printGrid.Children.Add(printPreviewMap); printMap.IsActive = true; } else { printGrid.Children.Remove(printPreviewMap); printMap.IsActive = false; } }
however, the preview map is not honoring changes made to layers within the map control (MyMap). If layers or graphics are added/removed, they are not showing up in the preview map, even if the control is loaded/unloaded. Maybe I'm missing something...
The preview window was not designed to stay in sync with the main map. The idea was to get a snapshot of the main map when the preview opens. So after changing visibilities of a layer, the user has to close and reopen the preview window.Nevertheless it makes sense to keep the 2 windows in sync, I will try to update the sample soon.
printGrid.Children.Remove(printPreviewMap);
private void printMap_Click(object sender, RoutedEventArgs e) { int y = printGrid.Children.Count; if (y < 1) { printGrid.Children.Add(printPreviewMap); } else { printGrid.Children.Remove(printPreviewMap); } }
if the user modifies the map in any way (adds another layer, zooms to another portion of the map, or adds/removes more graphics) those changes are not reflected in the preview window
<userControls:DraggableWindow IsOpen="True" x:Name="printWindow" Margin="0,20,20,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="Auto" Height="Auto" Padding="0" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Title="Print Map" Background="{StaticResource BaseColor}" Grid.Column="2"> <i:Interaction.Triggers> <i:EventTrigger> <actions:ToggleWindowVisibilityAction/><!-- Hide at startup --> </i:EventTrigger> </i:Interaction.Triggers> <ESRI_ArcGIS_Client_Samples_MapPrinting:PrintPreview x:Name="printPreviewMap" Grid.Column="1" HorizontalAlignment="Right" Margin="0,0,20,20" VerticalAlignment="Bottom"> <ESRI_ArcGIS_Client_Samples_MapPrinting:MapPrinter x:Name="printMap" Map="{Binding ElementName=MyMap}" MapUnits="Meters" d:LayoutOverrides="Width, Height" Style="{StaticResource MapPrinterStyle}" PrintExtent="{Binding Extent.Extent, ElementName=MyMap, Mode=TwoWay}" Title="{StaticResource Title}"/> </ESRI_ArcGIS_Client_Samples_MapPrinting:PrintPreview> </userControls:DraggableWindow>
private void OnRotateMapChanged(bool rotateMap) { if (_isLoaded) { _printMap.Rotation = (rotateMap ? -90 : 0); PreparePages(); } }
_isLoaded = true; _printMap.SizeChanged += (s, e) => { PreparePages(); SetPrintMapExtent(CurrentPage); }; // Calculate print pages when printMap size will be known (or changed by selecting a printer or a printer paper size) _printMap.Rotation = (RotateMap ? -90 : 0); PreparePages();
map.TimeExtent = mapToClone.TimeExtent; //map.Rotation = mapToClone.Rotation; int index = 0;
<UserControl.Resources> <controls:ToVisibilityConverter x:Key="toVisibility" /> <Style x:Key="mapPrinterStyle" TargetType="controls:MapPrinter"> <Setter Property="Foreground" Value="#FF333333"/> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0"> <GradientStop Color="#FFFFFFFF" Offset="0"/> <GradientStop Color="#FFF9FAFB" Offset="0.375"/> <GradientStop Color="#FFE5E8EB" Offset="0.625"/> <GradientStop Color="#FFCBD1D7" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="BorderBrush"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FFA3AEB9" Offset="0"/> <GradientStop Color="#FF8399A9" Offset="0.375"/> <GradientStop Color="#FF718597" Offset="0.375"/> <GradientStop Color="#FF617584" Offset="1"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="BorderThickness" Value="1" /> <Setter Property="Height" Value="1050" /> <Setter Property="Width" Value="750" /> <Setter Property="ExtentFillSymbol"> <Setter.Value> <esri:SimpleFillSymbol Fill="#05FF0000" BorderBrush="Red" BorderThickness="2" /> </Setter.Value> </Setter> <Setter Property="PageFillSymbol"> <Setter.Value> <esri:SimpleFillSymbol Fill="#050000FF" BorderBrush="Blue" BorderThickness="2" /> </Setter.Value> </Setter> <Setter Property="TextSymbol"> <Setter.Value> <esri:MarkerSymbol > <esri:MarkerSymbol.ControlTemplate> <ControlTemplate> <TextBlock RenderTransformOrigin="0,0" Text="{Binding Attributes[Page]}" FontSize="72" Foreground="#800000FF"> <TextBlock.RenderTransform> <CompositeTransform TranslateX="-35" TranslateY="-50" ScaleX="1" ScaleY="1" /> </TextBlock.RenderTransform> </TextBlock> </ControlTemplate> </esri:MarkerSymbol.ControlTemplate> </esri:MarkerSymbol> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="controls:MapPrinter"> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="0"> <Border Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}" Margin="0"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition /> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="300" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <!-- Header --> <TextBlock Text="{TemplateBinding PrintDocumentName}" HorizontalAlignment="Center" FontSize="12" Grid.Row="0" Grid.ColumnSpan="2" Visibility="{Binding PrintDocumentName, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource toVisibility}}"/> <!-- Body--> <StackPanel Grid.Row="1" Grid.Column="0"> <TextBlock TextWrapping="Wrap" Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at leo eu dolor rhoncus lacinia at a elit. Praesent in justo tellus, in consectetur magna. Vivamus nec velit urna, ut posuere odio. Quisque placerat odio id nibh bibendum tristique. Suspendisse ullamcorper mauris in turpis adipiscing cursus. Nullam malesuada ultricies elit id sodales. Nam tincidunt, enim at dapibus facilisis, quam nulla iaculis dolor, vel eleifend nisi ligula at massa. Integer aliquam vestibulum velit, sed vestibulum neque sollicitudin at. Vestibulum magna diam, porta in varius ut, tempus nec mi. Proin rhoncus lacinia tortor, et laoreet neque tincidunt in. Cras varius sagittis augue sed congue. Fusce ipsum enim, iaculis quis luctus nec, facilisis ac sem. In tortor orci, tempus vel accumsan a, rhoncus vitae arcu. Praesent nisl diam, lobortis et venenatis vitae, pretium eget felis. In porta mi vel libero mattis vel bibendum felis tempus. Vestibulum vehicula suscipit hendrerit. Praesent luctus mattis lorem. Vivamus pharetra nunc placerat tortor consequat a tempus leo aliquam. Etiam iaculis lacus quis tortor porta gravida. Duis congue hendrerit sem, sed consectetur justo sollicitudin eu. Sed fringilla tortor et tortor ullamcorper vitae pulvinar orci luctus. Ut egestas ullamcorper nibh, nec venenatis nulla suscipit sed. In nec quam leo, at fermentum nisi. Curabitur at pretium ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce porttitor, risus eget rhoncus lobortis, felis leo placerat turpis, eget aliquam odio nibh non massa. Integer vel nunc sem, vel lacinia enim. Ut auctor erat ut nisl tristique eget sodales risus gravida. Duis velit dolor, porta eu posuere ac, hendrerit ac nisl. Nam id molestie ante. Sed molestie sodales purus, malesuada dictum nisi sollicitudin a. Nulla mattis auctor turpis, non tempus nisl tempor a. Donec vel libero vitae elit congue sollicitudin. Nullam volutpat bibendum convallis. Nulla id urna nunc. Donec molestie volutpat risus, ac accumsan est tristique non. Aliquam commodo, nisi quis luctus consequat, leo ligula blandit sapien, hendrerit sagittis nisi nisl a dui. Maecenas varius leo ut ante pellentesque euismod. Praesent placerat ornare ante id tincidunt. Cras scelerisque lacinia facilisis. Aenean felis odio, imperdiet nec porttitor nec, pulvinar id urna. Phasellus congue lectus vitae nisi commodo nec blandit leo accumsan. Nullam ultrices lectus id quam vestibulum in molestie leo malesuada. Cras augue orci, mattis in hendrerit et, tincidunt vel urna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin vestibulum tortor in leo feugiat aliquet. Duis nulla mauris, malesuada sed molestie id, imperdiet vitae nisi. Phasellus facilisis aliquam sem, ac porta dolor euismod bibendum. " /> </StackPanel> <Grid Grid.Row="1" Grid.Column="1"> <!-- Map--> <!--<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">--> <esri:Map x:Name="PrintMap" IsLogoVisible="False" /> <!--</Border>--> <!-- Scale Bar --> <esri:ScaleBar Map="{Binding ElementName=PrintMap}" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="20,0,0,10" Grid.Row="1" TextColor="Black"/> </Grid> <!-- Footer --> <TextBlock TextWrapping="Wrap" Grid.Row="2" Grid.ColumnSpan="2" Text="Duis elit tortor, sollicitudin in pharetra ut, facilisis fringilla nisi. Donec tortor est, rhoncus dapibus pretium quis, sollicitudin in neque. Morbi rhoncus tincidunt nulla. Vestibulum tincidunt suscipit sem, ut ultrices elit sollicitudin eu. Nunc dapibus venenatis augue id iaculis. Proin porta pulvinar augue id lobortis. Vivamus in vestibulum libero. Fusce ac purus eget ante sollicitudin porttitor. Morbi convallis, mi a consequat elementum, odio mauris suscipit diam, eu consectetur sem enim vitae lacus. Sed dictum massa eu sem vehicula adipiscing. Donec vitae nunc id nisl blandit lobortis in eget tellus. In sit amet tincidunt elit. Praesent ac turpis eget nibh laoreet varius nec sit amet magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. "/> <TextBlock HorizontalAlignment="Left" VerticalAlignment="Bottom" Grid.Row="3" Text="{Binding Now, StringFormat='Printed {0:d} '}" /> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" Grid.Row="3" Grid.ColumnSpan="2" Text="{Binding Scale, StringFormat='1 : {0:F0} '}" /> <StackPanel HorizontalAlignment="Right" VerticalAlignment="Bottom" Orientation="Horizontal" Grid.Row="3" Grid.ColumnSpan="2"> <TextBlock Text="{Binding CurrentPage, RelativeSource={RelativeSource TemplatedParent}, StringFormat='Page {0} '}" /> <TextBlock Text="{Binding PageCount, RelativeSource={RelativeSource TemplatedParent}, StringFormat='/ {0}'}" /> </StackPanel> </Grid> </Border> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </UserControl.Resources>
<controls:PrintPreview x:Name="PrintPreview" Background="{StaticResource CommonBackgroundBrush}" > <controls:MapPrinter Map="{Binding ElementName=Map}" PrintDocumentName="Tour de France 2010" IsActive="True" Height="1050" Width="750" Style="{StaticResource mapPrinterStyle}" IsScaleFixed="True" Scale="2000000" PrintExtent="-400000, 5230000, 840000, 6870000" BorderBrush="DarkBlue" BorderThickness="1" Foreground="White" Background="MediumSlateBlue" /> </controls:PrintPreview>
Is it possible to print to PDF file (like export to PDF file), instead of print to printer driver?
Thanks Dominique, but when I try to change the template programmatically the print preview goes blank.
ControlTemplate dt = (ControlTemplate)Resources["myMapPrinterCT"]; mapPrinterWithPreview.Template = dt;
<Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="controls:MapPrinter"> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="0"> <Border Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}" Margin="0"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition /> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <!-- Header --> <TextBlock Text="{Binding PrintDocumentName}" HorizontalAlignment="Center" FontSize="12" Grid.Row="0" Visibility="{Binding PrintDocumentName, Converter={StaticResource toVisibility}}"/> <!-- Body--> <Grid Grid.Row="1"> <!-- Map--> <esri:Map x:Name="PrintMap" IsLogoVisible="False" /> <!-- Scale Bar --> <esri:ScaleBar Map="{Binding ElementName=PrintMap}" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="20,0,0,10" Grid.Row="1" TextColor="Black"/> </Grid> <!-- Footer --> <TextBlock HorizontalAlignment="Left" VerticalAlignment="Bottom" Grid.Row="2" Text="{Binding Now, StringFormat='Printed \{0:d\} '}" /> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" Grid.Row="2" Text="{Binding Scale, StringFormat='1 : \{0:F0\} '}" /> <StackPanel HorizontalAlignment="Right" VerticalAlignment="Bottom" Orientation="Horizontal" Grid.Row="2"> <TextBlock Text="{Binding CurrentPage, StringFormat='Page \{0\} '}" /> <TextBlock Text="{Binding PageCount, StringFormat=/ \{0\}}" /> </StackPanel> </Grid> </Border> </Border> </ControlTemplate> </Setter.Value> </Setter>
Silverlight 4 comes with built-in APIs for printing, so you don't need to roundtrip to the server. Basically you can print out any control. That control could be either the map, or a custom user control that contains the map, a title etc.
Angemeldete Mitglieder können Beiträge verfassen, Updates folgen und mehr. Neu hier? Registriere ein kostenloses Konto.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.