2016-06-01 27 views
7

Tôi đang sử dụng một số mã mà tôi tìm thấy tại http://brianlagunas.com/wpf-copy-uielement-as-image-to-clipboard/ để sao chép XAML Treeview được hiển thị. Các treeview được cấu hình để di chuyển nếu nội dung tràn chiều cao có sẵn.Làm thế nào để sao chép một FrameworkElement bao gồm cả nội dung tràn?

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

Đó hoạt động tốt khi nội dung của tôi phù hợp với bên trong khu vực khách hàng:

Treeview when client area is large enough to avoid overflow

Nhưng đó là vấn đề khi nội dung tràn vùng client:

Treeview when client area is too small and overflow occurs

Có một cách mà tôi có thể lấy toàn bộ nội dung kiểm soát mà không cần có phải đổi kích thước phần tử trên màn hình không?

Edit: Đây là 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> 

Và nút gắn kết các TreeView để lệnh của nút:

  <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

Tôi không biết điều này có thực hiện được hay không, nhưng bạn đã thử đặt 'VirtualizingStackPanel.IsVirtualizing =" False "' trên điều khiển TreeView chưa? –

+0

Điều đó có thể buộc tất cả các nút hiển thị (mặc dù Treeview mẫu của tôi là rất nhỏ, vì vậy tôi không thể thấy bất kỳ sự khác biệt nào), nhưng dường như không thay đổi bmp được hiển thị. – ThunderFrame

+0

Nếu 'param' là điều khiển' TreeView' bạn muốn vẽ nó hoạt động chính xác. Có thể bạn đang chuyển điều khiển 'ScrollViewer' đến hàm. –

Trả lời

1

tôi đã làm một số thử nghiệm với mã của bạn. Vấn đề có vẻ là bạn đang sử dụng element.ActualHeightelement.ActualWidth để tạo bitmap, tất nhiên là bằng kích thước hiện tại của điều khiển TreeView (không phải bảng điều khiển nội dung thực sự dài hơn), vì vậy đó là những gì bạn được hiển thị trong đầu ra.

Tôi đã làm gì để khắc phục sự cố là đặt ScrollViewer.VerticalScrollBarVisibility thành Disabled cho TreeView và sau đó bọc nó vào một ScrollViewer. Điều này sẽ làm cho chiều cao đầy đủ của bạn là TreeView mà nó yêu cầu và vẫn có thanh cuộn để cuộn qua nó. Bây giờ khi bạn xây dựng bitmap của bạn bằng cách sử dụng ActualWidth và ActualHeight, bạn nhận được một bitmap kích thước đầy đủ và hiển thị nó cho kết quả mong muốn.

Các vấn đề liên quan