0

我正在寻找一个通用的 Nuget 包/库来将用户控件呈现为位图。我可以使用已知的用户控件来完成这项工作,包括等待任何图像控件加载其源代码,但这并不像通用解决方案那么容易(传递控件,返回位图)。我希望 Measure/Arrange 调用与 SizeChanged/Loaded/LayoutUpdated 事件相结合,可以帮助我知道一切何时完全准备就绪,但事件不会在我期望的时候加载。有没有我不知道的解决方案,或者有什么方法可以更好地连接事件?

4

1 回答 1

2

Loaded在页面上触发事件后,您可以将任何控件呈现为位图。例如,下面的代码应该将您的 LayoutRoot 和 ContentPanel 渲染为位图,然后将它们保存为手机图片库中的 jpg。

public MainPage() {
  InitializeComponent();

  Loaded += (s, e) => {
    SaveToMediaLibrary(GetBitmap(LayoutRoot), "LayoutRoot.jpg", 100);
    SaveToMediaLibrary(GetBitmap(ContentPanel), "ContentPanel.jpg", 100);
  };
}

private WriteableBitmap GetBitmap(FrameworkElement fe) {
  // This will make sure all content are sized properly before returning
  //fe.UpdateLayout();

  var bmp = new WriteableBitmap((int)fe.ActualWidth, (int)fe.ActualHeight);
  bmp.Render(fe, new MatrixTransform());         
  bmp.Invalidate();
  return bmp; 
}       

public void SaveToMediaLibrary(WriteableBitmap bitmap, string name, int quality) {   
  using (var stream = new MemoryStream())            {         
    // Save the picture to the Windows Phone media library.             
    bitmap.SaveJpeg(stream, bitmap.PixelWidth, bitmap.PixelHeight, 0, quality);   
    stream.Seek(0, SeekOrigin.Begin);            
    new MediaLibrary().SavePicture(name, stream);        
  }     
}
于 2013-07-16T21:03:54.467 回答