如何复制包含溢出内容的FrameworkElement?

时间:2016-06-01 15:07:48

标签: c# wpf xaml bitmap drawing

我正在使用我在http://brianlagunas.com/wpf-copy-uielement-as-image-to-clipboard/找到的一些代码来复制渲染的XAML Treeview。如果内容溢出可用高度,则树视图配置为滚动。

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

当我的内容适合客户区域时,它可以正常工作:

Treeview when client area is large enough to avoid overflow

但是当内容溢出客户区时会出现问题:

Treeview when client area is too small and overflow occurs

有没有办法让我可以获取整个控件内容,而不必调整屏幕元素的大小?

修改 这是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>

将树视图绑定到按钮命令的按钮:

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

1 个答案:

答案 0 :(得分:1)

我对您的代码进行了一些实验。问题似乎是您正在使用element.ActualHeightelement.ActualWidth来构造位图,这当然等于TreeView控件的当前大小(而不是实际上更长的内容面板) ),这就是你在输出中呈现的内容。

我为解决问题所做的是为ScrollViewer.VerticalScrollBarVisibility设置DisabledTreeView,然后将其包含在ScrollViewer内。这将使您的TreeView全高度变为所需,并且仍然有滚动条滚动它。现在,当您使用ActualWidth和ActualHeight构建位图时,您将获得一个完整大小的位图并呈现它,从而得到所需的结果。