2009-09-22 14 views
5

Chcę utworzyć instancję kontrolki użytkownika programowo w bibliotece DLL, aby zapisać ją później jako plik PNG. Z reguły nie ma problemu z PngBitmapEncoder i RenderTargetBitmap.WPF Utwórz instancję użytkownika programowo, aby renderować ją jako PNG

To są moje pytania:

  • Jak formantu? Po prostu z nowym operatorem?
  • Czy muszę utworzyć instancję w oddzielnym wątku?
  • Jak wymusić na sterowaniu aktualizację wszystkich jego elementów podrzędnych i ponowne zrenderowanie?

To jest mój kod do formantu użytkownika i zapisać go jako PNG-pliku (LetterFrequency jest kontrola użytkownika):

[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); 
     } 
    } 

Po uruchomieniu aplikacji w ten sposób, że generuje plik PNG , ale dane, które zostaną dodane w XAML, nie są widoczne, jeśli zajrzysz do Projektanta XAML, możesz zobaczyć wykres z kilkoma bąbelkami. Plik png zawiera tylko obszar wykresu, ale bez bąbelków? Dlaczego to? Myślę, że jest to problem z aktualizacją/renderowaniem, ale jak rozwiązać ten problem?

Oto rozwiązanie studia wizualnego, zawiera projekt konsolowy, który przekazuje kontrolę użytkownika do pliku PNG i dwa inne projekty zestawu narzędzi WPF dla wykresu.

Wystarczy popatrzeć na to, wygeneruje plik PNG w bin/Debug odpowiednio w folderze exe: http://www.file-upload.net/download-1904406/ChartRenderBitmap.zip.html

Mam nadzieję, że działa bez problemów!

Dzięki!

Odpowiedz

2

Dane na wykresie nie są renderowane w pliku PNG, ponieważ do ujawnienia punktów danych zastosowano animację. Spójrz na kontrolkę Letter Type w oknie, a zobaczysz, że punkty stopniowo się ujawniają.

Twój kod wykonuje migawkę kontrolki natychmiast po jej utworzeniu, więc nie widzisz żadnych danych.

Mogłabyś:

  1. zawinąć wszystko to w oknie i powiedzieć to wziąć migawkę po X sekund
  2. wyłączyć wszystkie animacje w jakiejkolwiek kontroli masz zamiar migawce
  3. Może jest sposób, aby "szybko przewinąć" animacje programowo, ale nie mogłem znaleźć jeden

Oto rozwiązanie 1, i to działa:

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

Dziękuję za ciekawe rozwiązanie, ale generowanie wykresu powinny być wykonane tak szybko, jak to możliwe, więc nie animacja byłby najlepszy. Aby zastąpić animację, po prostu utworzyłem nowy szablon kontrolny dla punktu danych z bąbelkami, ale jest teraz inny problem z elementem legendy. Zobacz mój punkt odpowiedzi! –

Powiązane problemy