3

表示する行が多すぎるデータグリッドのスクリーンショットを撮ろうとしています。したがって、スクロールビューアがあります。したがって、データグリッドを RenderTargetBitmap の Render メソッドに入れると、明らかにデータグリッドの表示可能な部分が取得されます。ItemsPresenter はコンテンツの「実際の」幅と高さを持つため、そのコントロールの ScrollViewer の ItemsPresenter を実際にレンダリングするときに、コンテンツのスクリーンショットを撮ることができることを読みました。

残念ながら、私の ScrollViewer には、dataGrid とは異なる Height、ActualHeight、または RenderSize.Height がありません。だから私は常にコンテンツの目に見える部分を取得します。

これを正しい方法で行う方法を知っている人はいますか?実際にはコンテンツ全体が必要です。

コード:

        var scroll = GetTemplateChildByName(dataGridInOut);
        if (scroll != null)
        {
            var item = scroll.Content as ItemsPresenter;
            var width = item.RenderSize.Width;
            var height = item.RenderSize.Height;
            var rtb = new RenderTargetBitmap((int) Math.Round(width), (int)Math.Round(height), 96, 96,
                                             PixelFormats.Pbgra32);
            var drawingVisual = new DrawingVisual();
            var visualBrush = new VisualBrush(item);
            using (var context = drawingVisual.RenderOpen())
            {
                context.DrawRectangle(visualBrush, null, new Rect(new Point(0,0), new Size(width, height)));
            }
            rtb.Render(drawingVisual);
            Clipboard.SetImage(rtb);
        }
4

1 に答える 1

0

葉 そうですね。プログラムで同じソースにバインドされた別の DataGrid をインスタンス化し、それをコンテナーに入れて無限のスペースを提供し、レンダリングを待ってから、これのスクリーンショットを撮ることができます。実際に UI に表示する必要はありません。

于 2012-05-18T13:49:54.030 に答える