2016-06-01 24 views
7

Sto utilizzando un codice che ho trovato a http://brianlagunas.com/wpf-copy-uielement-as-image-to-clipboard/ per copiare una visualizzazione struttura XAML renderizzata. La vista ad albero è configurata per lo scorrimento se il contenuto supera l'altezza disponibile.Come copiare un FrameworkElement incluso il contenuto in overflow?

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); 

che funziona bene quando il mio contenuto si inserisce all'interno dell'area client:

Treeview when client area is large enough to avoid overflow

Ma è problematico quando il contenuto superano l'area client:

Treeview when client area is too small and overflow occurs

C'è un modo per ottenere l'intero contenuto di controllo senza dovendo ridimensionare l'elemento sullo schermo?

Edit: Ecco il 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> 

e il pulsante che lega la vista ad albero al comando del tasto:

  <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> 
+0

Non so se questo potrebbe fare il trucco o no, ma hai provato a impostare 'VirtualizingStackPanel.IsVirtualizing =" False "' sul controllo TreeView? –

+0

Ciò potrebbe costringere tutti i nodi a eseguire il rendering (sebbene il mio esempio di visualizzazione di esempio sia molto piccolo, quindi non vedo alcuna differenza), ma non sembra che cambi il bmp renderizzato. – ThunderFrame

+0

Se 'param' è il controllo' TreeView' che vuoi disegnare funziona correttamente. Forse stai passando il controllo 'ScrollViewer' alla funzione. –

risposta

1

ho fatto alcuni esperimenti con il codice. Il problema sembra essere che stai usando element.ActualHeight e element.ActualWidth per costruire la bitmap, che ovviamente è uguale alla dimensione corrente del controllo TreeView (non il pannello dei contenuti che è in realtà più lungo), quindi questo è ciò che viene visualizzato nella produzione.

Quello che ho fatto per risolvere il problema è stato quello di impostare ScrollViewer.VerticalScrollBarVisibility al Disabled per la TreeView e poi avvolgerlo in un ScrollViewer. Questo renderà il tuo TreeView a tutta altezza che richiede e continua ad avere una barra di scorrimento per scorrere attraverso di esso. Ora quando costruisci la tua bitmap usando ActualWidth e ActualHeight, ottieni una bitmap a dimensione intera e il rendering dà il risultato desiderato.

Problemi correlati