2009-09-22 11 views
5

के रूप में प्रस्तुत करने के लिए मैं एक डीएलएल में उपयोगकर्ता नियंत्रण को तत्काल रूप से पीएनजी फ़ाइल के रूप में सहेजने के लिए तत्काल करना चाहता हूं। यह आमतौर पर PngBitmapEncoder और RenderTargetBitmap के साथ कोई समस्या नहीं है।WPF Instantiate उपयोगकर्ता नियंत्रण प्रोग्रामिंग रूप से इसे पीएनजी

  • मैं नियंत्रण कैसे दृष्टांत है:

    यह मेरा सवाल कर रहे हैं? बस नए ऑपरेटर के साथ?

  • क्या मुझे इसे एक अलग थ्रेड में तुरंत चालू करना है?
  • मैं अपने सभी बच्चों को अपडेट करने और खुद को फिर से प्रस्तुत करने के लिए नियंत्रण को कैसे मजबूर करूं?

    [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 फ़ाइल उत्पन्न करता है:

इस उपयोगकर्ता नियंत्रण का दृष्टांत और PNG फ़ाइल के रूप में सहेज करने के लिए अपने कोड है (LetterFrequency उपयोगकर्ता नियंत्रण है) , लेकिन एक्सएएमएल में जो डेटा जोड़ा जाएगा, वह दिखाई नहीं दे रहा है, अगर आप एक्सएएमएल डिज़ाइनर को देखते हैं, तो आप कुछ बुलबुले वाले चार्ट देख सकते हैं। पीएनजी फ़ाइल में केवल चार्ट क्षेत्र है, लेकिन कोई बुलबुले नहीं है? यह क्यों? मुझे लगता है कि अद्यतन/प्रतिपादन समस्या है, लेकिन इसे कैसे हल करें?

यहां विजुअल स्टूडियो समाधान है, इसमें कंसोल प्रोजेक्ट है, जो उपयोगकर्ता के नियंत्रण को पीएनजी फ़ाइल और चार्ट के लिए WPF टूलकिट की दो अन्य परियोजनाओं में प्रस्तुत करता है।

यह पर एक नज़र डालें, यह exe-फ़ोल्डर में क्रमश: बिन/डीबग में PNG फ़ाइल उत्पन्न करेगा: http://www.file-upload.net/download-1904406/ChartRenderBitmap.zip.html

यह समस्याओं के बिना काम करता है आशा है!

धन्यवाद!

उत्तर

2

आपके चार्ट में डेटा आपके पीएनजी फ़ाइल में प्रस्तुत नहीं किया गया है क्योंकि डेटा बिंदुओं के प्रकट होने के लिए एक एनीमेशन लागू होता है। एक विंडो में अपने लेटर फ़्रीक्वेंसी नियंत्रण पर नज़र डालें, और आप अंक धीरे-धीरे खुद को प्रकट करेंगे।

आपका कोड इसके निर्माण के तुरंत बाद नियंत्रण का स्नैपशॉट लेता है, इसलिए आपको कोई डेटा दिखाई नहीं देता है।

आप किए जा सकेंगे:

  1. एक खिड़की में यह सब लपेट और बता यह एक्स के बाद स्नैपशॉट ले सेकंड के लिए
  2. अक्षम सभी एनिमेशन किसी भी नियंत्रण आप स्नैपशॉट
  3. लिए जा रहे हैं में
  4. शायद "फास्ट-फॉरवर्ड" एनिमेशन प्रोग्रामेटिक रूप से एक तरीका है, लेकिन मैं नहीं देख सकता

यहाँ समाधान 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

अपने दिलचस्प समाधान के लिए धन्यवाद, लेकिन चार्ट की पीढ़ी के रूप में तेजी से संभव के रूप में किया जाना चाहिए, ताकि कोई एनीमेशन सबसे अच्छा होगा। एनीमेशन को ओवरराइड करने के लिए, मैंने बस बबल डेटा पॉइंट के लिए एक नया नियंत्रण टेम्पलेट बनाया है, लेकिन अब किंवदंती आइटम के साथ एक और समस्या है। मेरे उत्तर पोस्ट पर एक नज़र डालें! –

संबंधित मुद्दे