如何在不创建窗口的情况下将WPF UserControl呈现到位图

bbo*_*sak 24 .net c# windows wpf graphics

如何在不创建窗口的情况下将WPF UserControl呈现到位图?我需要渲染一个WPF UserControl并将其上传到另一个程序.位图将通过Windows服务呈现,因此创建一个窗口不是一个选项(我知道有几种方法'虚拟'创建窗口,但不幸的是,任何调用命令创建窗口的东西都不是我的选择.有没有办法将UserControl RENDER而不将其绑定到Window?

RQD*_*QDQ 59

您是否尝试过旋转用户控件的实例并执行以下操作:

UserControl control = new UserControl1();

control.Measure(new Size(300, 300));
control.Arrange(new Rect(new Size(300,300)));

RenderTargetBitmap bmp = new RenderTargetBitmap(300, 300, 96, 96, PixelFormats.Pbgra32);

bmp.Render(control);

var encoder = new PngBitmapEncoder();

encoder.Frames.Add(BitmapFrame.Create(bmp));

using (Stream stm = File.Create(@"c:\test.png"))
   encoder.Save(stm);
Run Code Online (Sandbox Code Playgroud)

看起来你需要测量,安排.这对我有用.

  • 添加了测量/排列呼叫.这对我有用. (4认同)
  • 如果它对某人有帮助,在`Arrange()之后立即调用`control.UpdateLayout()`为我做了诀窍. (3认同)
  • Google搜索将用户控件导出为JPG,这使我很满意,这个答案很完美。非常感谢。 (2认同)

bbo*_*sak 7

使用没有实际窗口的HwndHost结束.

void cwind()
    {
        Application myapp = new Application();
        mrenderer = new WPFRenderer();
        mrenderer.Width = 256;
        mrenderer.Height = 256;

        HwndSourceParameters myparms = new HwndSourceParameters();
        HwndSource msrc = new HwndSource(myparms);
        myparms.HwndSourceHook = new HwndSourceHook(ApplicationMessageFilter);

        msrc.RootVisual = mrenderer;
        myapp.Run();
    }
    static IntPtr ApplicationMessageFilter(
IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        return IntPtr.Zero;
    }
Run Code Online (Sandbox Code Playgroud)

  • 请告诉我什么是WPFRenderer?(汇编文件和命名空间在哪里) (2认同)