5

私はさまざまなサイズの UI 要素 (WPF) のスクリーンショットを撮ることに取り組んでおり、「RenderTargetBitmap を使用してこれを達成することができます。しかし、コピーを取得している間UIElement、一部を持っているものAdornerは来ません。これを達成するにはどうすればよいですか。任意の参照またはコードスニペット?

4

3 に答える 3

4

ネイティブの WPF 印刷名前空間を使用して XPS ファイルに出力すると、結果にアドナーが含まれます (テストに成功しました)...

using System.Windows.Controls;
private void ExecutePrintCommand(object obj)
{
    PrintDialog printDialog = new PrintDialog();
    if (printDialog.ShowDialog() == true)
    {
        printDialog.PrintVisual(_mainWindow, "Main Window with Adorner");
    }
}

PrintDialog を使用したくない場合 (実際にダイアログ ボックスが開きます)。XpsDocumentWriter クラスを使用して、プログラムでプロセスを制御できます。これを有効にするスニペットは...

     XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(q);
     xpsdw.Write(viewer.Document);

...ここから抽出されました: Print FixedDocument programmatically そして、それが要件の一部である場合、プロセスの微調整に関する記事が他にもあります。XPS ファイルは、実際には「xps」ファイルを装った「zip」ファイルであるため、拡張子を変更して解凍し、内容が有用かどうかを確認してください。

第二に、このコードを使用して、TextBox の装飾を使用してウィンドウを保存することをテストしました...

    private void SaveWithAdorner()
    {
        RenderTargetBitmap rtb = RenderVisaulToBitmap(_mainWindow, 500, 300);
        MemoryStream file = new MemoryStream();
        BitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(rtb));
        encoder.Save(file);
        using (FileStream fstream = File.OpenWrite("Myimage.jpg"))
        {
            file.WriteTo(fstream);
            fstream.Flush();
            fstream.Close();
        }
    }

...良い結果が得られました。つまり、装飾は保存されたビットマップに赤い境界線で表示されます。私は Png エンコーダーを使用しているため、これはコードとは異なる場合があります (ただし、「jpg」ファイルに保存されます)。

両方のアプローチを正常にテストしましたが、ハードウェアで確認する必要があります。

そして最後に、最後の手段として、WPF のハードウェア レンダリング モードを無効にして、ソフトウェア レンダリングに設定することができます...

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;

...ここに素敵なSOスレッドがあります: ソフトウェアレンダリングモード-WPF

于 2013-08-18T22:57:33.793 に答える
0

私の場合、次のようにAdornerLayerクラスを呼び出すだけで済みました。

    public void GetScreenshotWithAdorner(Canvas canvas, string filename)
    {
      AdornerLayer adornerlayer = AdornerLayer.GetAdornerLayer(canvas);

      RenderTargetBitmap rtb = new RenderTargetBitmap(
        (int)canvas.ActualWidth,
        (int)canvas.ActualHeight,
        96, //dip X
        96, //dpi Y
        PixelFormats.Pbgra32);
      rtb.Render(canvas); //renders the canvas screen first...
      rtb.Render(adornerlayer); //... then it renders the adorner layer

      SaveRTBAsPNG(rtb, filename);
    }

    private void SaveRTBAsPNG(RenderTargetBitmap bmp, string filename)
    {
      PngBitmapEncoder pngImage = new PngBitmapEncoder();

      pngImage.Frames.Add(BitmapFrame.Create(bmp));
      using (var filestream = System.IO.File.Create(filename))
      {
        pngImage.Save(filestream);
      }
    }

これは、キャンバスにすべての装飾を含めたい場合に機能します。

于 2017-07-06T13:34:03.247 に答える