2010-08-31 22 views
0

我想將用戶控件的圖像添加到viewbox。 我正在動態創建usercontrol。我正在使用下面的代碼。RenderTargetBitmap問題

private static RenderTargetBitmap CaptureScreen(Visual target, double dpiX, double dpiY) 
{ 
    if (target == null) 
    { 
     return null; 
    } 
    Rect bounds = VisualTreeHelper.GetDescendantBounds(target); 
    //RenderTargetBitmap rtb = new RenderTargetBitmap((int)(bounds.Width * dpiX/96.0), 
    //            (int)(bounds.Height * dpiY/96.0), 
    //            dpiX, 
    //            dpiY, 
    //            PixelFormats.Pbgra32); 
    RenderTargetBitmap rtb = new RenderTargetBitmap(596,596,dpiX, 
                dpiY, 
                PixelFormats.Pbgra32); 
    DrawingVisual dv = new DrawingVisual(); 
    using (DrawingContext ctx = dv.RenderOpen()) 
    { 
     VisualBrush vb = new VisualBrush(target); 
     ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size)); 
    } 
    rtb.Render(dv); 
    return rtb; 
} 

我正在動態創建用戶控件並將其傳遞給捕獲屏幕方法。

UserControls.UserControl1 uc1 = new UserControls.UserControl1(); 
         visualList.Add(uc1); 
for(int i = 0;i<=6;i++) 
     { 
      Image img = new Image(); 
      img.Source = CaptureScreen(visualList[i], 96, 96); 
      img.Margin = new Thickness { Top = 2 };     
      usingWorkaround.Children.Add(img); 
     } 

VisualTreeHelper.GetDescendantBounds(target)返回空白邊界。這就是爲什麼無法創建屏幕圖像。有沒有其他方法來捕獲動態創建的用戶控件的屏幕?

回答

0

當您嘗試創建圖像時,控件在視覺樹中還不存在,並且尺寸尚未計算。

您需要撥打措施安排在您的視覺第一。

+0

請解釋如何使用措施和安排 – 2011-02-04 17:28:19

+0

完整的代碼,你的答案。 – 2015-03-16 07:46:29

5

您可以撥打措施和安排如下

private void ForceUpdate(FrameworkElement element, double width, double height) 
    { 
    Size size = new Size(width, height); 

    element.Measure(size); 

    element.Arrange(new Rect(0, 0, width, height)); 

    element.UpdateLayout(); 
    } 
+0

我有一個疑問,上面的聲明,當我們調用強制更新方法時,我們是否需要顯式調用element.Measure和element.Arrage ?.至於我基於元素的理解.UpdateLayout()將自己調用核心方法[參考](http://msdn.microsoft.com/en-us/library/system.windows.uielement.updatelayout(v = vs 0.110)的.aspx) – Eldho 2014-11-07 07:05:50

相關問題