2009-09-22 10 views
5

ユーザーコントロールをDLLでプログラムでインスタンス化し、後でPNGファイルとして保存する必要があります。これは、PngBitmapEncoderとRenderTargetBitmapでは一般的に問題ありません。WPFユーザーコントロールをプログラムでインスタンス化してPNGとしてレンダリングする

これが私の質問です:

  • 私がコントロールをインスタンス化するにはどうすればよいですか?単に新しい演算子で?
  • 個別のスレッドでインスタンス化する必要がありますか?
  • どのようにしてコントロールがすべての子を更新し、再度レンダリングするようにするには?

これは(LetterFrequencyがユーザーコントロールである)ユーザーコントロールをインスタンス化し、PNGファイルとして保存するために私のコードです:

[STAThread] 
    static void Main(string[] args) 
    { 
     LetterFrequency let = new LetterFrequency(); 
     let.Width = 600; 
     let.Height = 400; 
     let.Background = Brushes.White; 

     let.Measure(new Size(let.Width, let.Height)); 
     let.Arrange(new Rect(new Size(let.Width, let.Height))); 

     let.UpdateLayout(); 

     RenderTargetBitmap bitmap = new RenderTargetBitmap((int)let.Width, (int)let.Height, 96d, 96d, PixelFormats.Pbgra32); 
     bitmap.Render(let); 

     PngBitmapEncoder png = new PngBitmapEncoder(); 
     png.Frames.Add(BitmapFrame.Create(bitmap)); 

     using (Stream stm = File.Create("test.png")) 
     { 
      png.Save(stm); 
     } 
    } 

アプリをこのように実行した場合、それはPNGファイルを生成XAMLで追加されるデータは表示されません.XAMLデザイナーを調べると、いくつかのバブルを含むグラフが表示されます。 pngファイルにはグラフ領域のみが含まれていますが、気泡はありませんか?どうして?私は更新/レンダリングの問題だと思いますが、これをどのように解決するのですか?

Visual Studioソリューションでは、ユーザーコントロールをPNGファイルとチャートのWPFツールキットの2つのプロジェクトにレンダリングするコンソールプロジェクトが含まれています。

はそれを見てください、それはexeファイル、フォルダ内のそれぞれのbin /デバッグでPNGファイルを生成します:http://www.file-upload.net/download-1904406/ChartRenderBitmap.zip.html

は、それが問題なく動作します願っています!

ありがとうございます!

答えて

2

データポイントの公開にアニメーションが適用されているため、グラフのデータはPNGファイルにレンダリングされません。あなたのLetterFrequencyコントロールをウィンドウで見てみると、徐々にポイントが現れてきます。

コードは、作成直後にコントロールのスナップショットを取得するので、データは表示されません。

あなたは可能性:

  1. ウィンドウでこのすべてをラップし、それがXの後 秒
  2. をスナップショットを取るために を伝えるあなたは スナップショット
  3. するつもり任意のコントロール内のすべてのアニメーション を無効にします
  4. "早送り"アニメーション プログラムでは、私はできませんでした
  5. ここで

は解決策1だし、それが動作します:

public partial class Window1 : Window 
{ 
    System.Windows.Threading.DispatcherTimer snapshotTimer; 

    public Window1() 
    { 
     InitializeComponent(); 

     this.Width = 600; 
     this.Height = 400; 
     let.Width = 600; 
     let.Height = 400; 
     let.Background = Brushes.White;  

     this.Loaded += new RoutedEventHandler(Window1_Loaded); 
    } 

    void Window1_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.snapshotTimer = new System.Windows.Threading.DispatcherTimer(); 
     this.snapshotTimer.Interval = TimeSpan.FromSeconds(2); 
     this.snapshotTimer.Tick += new EventHandler(snapshotTimer_Tick); 
     this.snapshotTimer.IsEnabled = true; 
    } 

    void snapshotTimer_Tick(object sender, EventArgs e) 
    { 
     this.snapshotTimer.IsEnabled = false; 
     WritePng(); 
    } 

    void WritePng() 
    { 
     RenderTargetBitmap bitmap = new RenderTargetBitmap((int)let.Width, (int)let.Height, 96d, 96d, PixelFormats.Pbgra32); 
     bitmap.Render(let); 

     PngBitmapEncoder png = new PngBitmapEncoder(); 
     png.Frames.Add(BitmapFrame.Create(bitmap)); 

     using (Stream stm = File.Create("test.png")) 
     { 
      png.Save(stm); 
     } 

     this.Close(); 
    } 
} 
+0

はあなたの興味深いソリューションをありがとう、しかし、チャートの生成が可能な限り高速で行う必要がありますので、何のアニメーションは最高ないだろう。アニメーションをオーバーライドするために、バブルデータポイント用の新しいコントロールテンプレートを作成しましたが、凡例アイテムにもう1つ問題があります。私の答えのポストを見てください! –

関連する問題