2012-01-13 15 views
6

私がやっている間違いを見つけ出すことはできますか?あなたは、私は一時的なイメージを作成し、それはStackPanelのために追加し、最終的WriteableBitmapを作成しています見ることができるようにプログラムでスタックパネルに子を追加すると動作しない

 StackPanel stackPanel = new StackPanel(); 
     stackPanel.Orientation = Orientation.Vertical; 
     for (int index = _elements.Count - 1; index >= 0; index--) 
     { 
      FrameworkElement element = _elements[index]; 
      WriteableBitmap tempBitmap = new WriteableBitmap(element, null); 
      Image image = new Image(); 
      image.Source = tempBitmap; 
      stackPanel.Children.Add(image); 
     } 

     stackPanel.UpdateLayout(); 

     _bitmap = new WriteableBitmap(stackPanel, null); 

     _bitmap.Invalidate(); 

:ここ

はコードです。 MYYのStackPanelの第一の子供は身長154であり、第二1は、この行の後に389である:私はそれがあるPixelHeight見るとき

_bitmap.Invalidate(); 

ちょうど389どこに第一子は行きましたか?

答えて

2

をレンダリングした後にビットマップをつかむせることを示唆しています。また、なぜレイアウトに追加したいのですか?それが便利なのであれば、私の場合、基本的に印刷用に使用されているヘルパークラスには、画面に表示されているUIElementsのいずれも参照されていないため、100%のメモリが必要です。その場合、明らかに私はこのハックを作るために私のLayoutRootや他のPanelをヘルパークラスに渡したくないのです!

要素をメモリにレンダリングするようにSilverlightランタイムに依頼すること。あなたは測定を呼び出して配置する必要があります前に、

stackPanel.Measure(new Size(width, height)); 
stackPanel.Arrange(new Rect(0, 0, width, height)); 

だから、一般的に、私が行方不明になったすべてのでした

_bitmap = new WriteableBitmap(stackPanel, null); 

そして私は、この行を取り除くことができます:

stackPanel.UpdateLayout(); 

これは、このスレッドに来て、私のような同じ問題を抱えている人が、LayoutRooを見つけることができない場合に役立ちます。あなたのヘルパークラスのt。

+0

何か追加するには、スタックパネルに高さと幅を明示的に設定し、それを使って 'Size'と' Rect'を設定してください –

0

のStackPanelは上のビジュアルappearenceになるまでのStackPanelまたは任意の他のパネル、彼らは(任意の視覚的な要素を)visulatreeに追加されるまで表示されません。.. 手段を..あなたがそれらの100個の要素をStackPanelのために100の項目を追加した場合は生成されません画面上にstackpanelを表示したくない場合は、stackpanelを追加してimmediatlyを削除したい場合は、

としてください。それはしませんので、それは...

OR

は、1つのピクセルの高さと幅を持っているXAMLでグリッドまたはのStackPanelを作成し、そのグリッドにあなたのStackPanelを追加したり、StackPanelの...のStackPanelはそれを子要素のレンダリングになります画面上で視認可能で、背景にレンダリングされます....

+0

あなたの答えは正しいが、必ずしも実現可能とは限りません。私の答えを見てください。 – TCM

0

バスタネニーが正しいです、あなたはスナップショットを撮る前にスタックパネルをレンダリングする必要があります。私はそれがフレームをレンダリングし、それがsLedgemとbathineniによって与えられた回答の両方が正しいですが、私の状況に合わせていないようです

 CompositionTarget.Rendering += CompositionTarget_Rendering; 
} 

void CompositionTarget_Rendering(object sender, EventArgs e) 
    { 
    _bitmap = new WriteableBitmap(stackPanel, null); 
    _bitmap.Invalidate(); 

    } 
+0

これは正しいが、必ずしも実現可能ではない。私の答えを見てください。 – TCM

関連する問題