visual studio source insertar imagen example c# wpf xaml bitmap drawing

c# - studio - ¿Cómo copiar un FrameworkElement incluido el contenido desbordado?



visual studio wpf insert image (1)

Estoy usando un código que encontré en http://brianlagunas.com/wpf-copy-uielement-as-image-to-clipboard/ para copiar una vista de árbol XAML renderizada. La vista en árbol está configurada para desplazarse si el contenido sobrepasa la altura disponible.

const long DPI = 96; FrameworkElement element = (FrameworkElement)param; double height = element.ActualHeight; double width = element.ActualWidth; RenderTargetBitmap bmp = new RenderTargetBitmap((int)Math.Round(width), (int)Math.Round(height), DPI, DPI, PixelFormats.Default); DrawingVisual dv = new DrawingVisual(); using (DrawingContext dc = dv.RenderOpen()) { VisualBrush vb = new VisualBrush(element); dc.DrawRectangle(vb, null, new Rect(new Point(), new Size(width, height))); } bmp.Render(dv); DataObject _data = new DataObject(); _data.SetImage(bmp);

Eso funciona bien cuando mi contenido se ajusta dentro del área del cliente:

Pero es problemático cuando el contenido se desborda en el área del cliente:

¿Hay alguna manera de que pueda obtener todo el contenido de control sin tener que cambiar el tamaño del elemento en pantalla?

Editar: Aquí está el Treeview XAML:

<TreeView x:Name="ProjectTree" Grid.Row="1" ItemContainerStyle="{StaticResource ShinyTreeView}" HorizontalContentAlignment="Stretch" MouseDoubleClick="TreeView_OnMouseDoubleClick" Style="{StaticResource CodeExplorerTreeViewStyle}" BorderThickness="0,1" VirtualizingPanel.IsVirtualizing="False"> <i:Interaction.Behaviors> <controls:BindableSelectedItemBehavior SelectedItem="{Binding SelectedItem, Mode=TwoWay}" /> </i:Interaction.Behaviors> </TreeView>

Y el botón que une la vista de árbol con el comando del botón:

<Button Command="{Binding CopyResultsCommand}" CommandParameter="{Binding ElementName=ProjectTree}"> <Image Height="16" Source="../../Resources/document-copy.png" /> <Button.ToolTip> <TextBlock Text="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=CodeExplorer_CopyToolTip}" /> </Button.ToolTip> </Button>


Hice algo de experimentación con tu código. El problema parece ser que estás usando element.ActualHeight y element.ActualWidth para construir el mapa de bits, que por supuesto es igual al tamaño actual del control TreeView (no el panel de contenido, que en realidad es más largo), así que eso es lo que renderizado en la salida.

Lo que hice para solucionar el problema fue establecer ScrollViewer.VerticalScrollBarVisibility en Disabled para TreeView y luego envolverlo dentro de ScrollViewer . Esto hará que su TreeView tenga la altura completa que requiere y aún tenga una barra de desplazamiento para desplazarse a través de él. Ahora cuando construyes tu mapa de bits usando ActualWidth y ActualHeight, obtienes un mapa de bits de tamaño completo y la representación da el resultado deseado.