2009-09-22 33 views
5

Tôi muốn khởi tạo điều khiển người dùng theo lập trình trong một tệp DLL để lưu nó sau đó dưới dạng tệp PNG. Điều này thường không có vấn đề với PngBitmapEncoder và RenderTargetBitmap.WPF Thực hiện điều khiển người dùng theo lập trình để hiển thị nó dưới dạng PNG

Đây là những câu hỏi của tôi:

  • Làm thế nào để nhanh chóng kiểm soát? Đơn giản với nhà điều hành mới?
  • Tôi có phải khởi tạo nó trong một chuỗi riêng biệt không?
  • Làm cách nào để buộc kiểm soát cập nhật tất cả các con của nó và tự hiển thị lại?

Đây là mã của tôi để nhanh chóng điều khiển người dùng và lưu nó như PNG-file (LetterFrequency là kiểm soát người sử dụng):

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

Nếu bạn chạy các ứng dụng theo cách này, nó tạo ra các tập tin PNG , nhưng dữ liệu, sẽ được thêm vào XAML không hiển thị, nếu bạn nhìn vào XAML Designer, bạn có thể thấy biểu đồ với một số bong bóng. Tệp png chỉ chứa khu vực biểu đồ, nhưng không có bong bóng? Lý do tại sao mà? Tôi nghĩ rằng đó là một vấn đề Cập nhật/kết xuất, nhưng làm thế nào để giải quyết vấn đề này?

Đây là giải pháp phòng thu trực quan, nó chứa Dự án Console, hiển thị điều khiển người dùng với tệp PNG và hai dự án khác của bộ công cụ WPF cho biểu đồ.

Có một cái nhìn vào nó, nó sẽ tạo ra file PNG trong bin/Debug tương ứng trong exe thư mục: http://www.file-upload.net/download-1904406/ChartRenderBitmap.zip.html

Hy vọng nó hoạt động mà không vấn đề!

Cảm ơn!

Trả lời

2

Dữ liệu trong biểu đồ của bạn không được hiển thị trong tệp PNG vì có một hoạt ảnh được áp dụng cho việc tiết lộ các điểm dữ liệu. Hãy xem kiểm soát LetterFrequency của bạn trong một cửa sổ, và bạn sẽ thấy các điểm dần dần tiết lộ mình.

Mã của bạn sẽ chụp nhanh kiểm soát ngay sau khi tạo, vì vậy bạn không thấy dữ liệu nào.

Bạn có thể:

  1. quấn tất cả điều này trong một cửa sổ và nói với nó để có những ảnh chụp sau khi X giây
  2. vô hiệu hóa tất cả các hình ảnh động trong bất kỳ điều khiển bạn sẽ chụp
  3. có thể có cách để hoạt ảnh "tua đi nhanh" theo lập trình, nhưng tôi không thể tìm một số

Đây là giải pháp 1, và nó hoạt động:

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

Cảm ơn bạn đã giải pháp thú vị của bạn, nhưng việc tạo ra bảng xếp hạng nên được thực hiện càng nhanh càng tốt, vì vậy không hình ảnh động sẽ là tốt nhất. Để ghi đè hình ảnh động, tôi chỉ cần tạo một mẫu điều khiển mới cho điểm dữ liệu bong bóng, nhưng bây giờ có một vấn đề khác với mục chú giải. Hãy xem bài trả lời của tôi! –

Các vấn đề liên quan