c# - डब्ल्यूपीएफ छवि संसाधन




.net wpf embedded-resource (9)

निष्पादन असेंबली में संसाधन लोड करने के लिए कोड में जहां मेरी छवि Freq.png फ़ोल्डर Icons और Resource रूप में परिभाषित किया गया था:

this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" 
    + Assembly.GetExecutingAssembly().GetName().Name 
    + ";component/" 
    + "Icons/Freq.png", UriKind.Absolute)); 

अगर कोई इसका इस्तेमाल कर सकता है तो मैंने एक समारोह भी बनाया है:

/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
/// <returns></returns>
public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
{
    if (assembly == null)
    {
        assembly = Assembly.GetCallingAssembly();
    }

    if (pathInApplication[0] == '/')
    {
        pathInApplication = pathInApplication.Substring(1);
    }
    return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute)); 
}

उपयोग (धारणा आपने फ़ंक्शन को हेल्पर क्लास में रखा है):

this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");

नोट : डब्ल्यूपीएफ में एमएसडीएन पैक यूआरआई देखें:
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

मैं ज्यादातर वेब और थोड़ा विंडोज फॉर्म पृष्ठभूमि से आया हूं। एक नई परियोजना के लिए, हम WPF का उपयोग करेंगे। WPF एप्लिकेशन को चित्रकारी उद्देश्यों के लिए 10-20 छोटे आइकन और छवियों की आवश्यकता होगी। मैं इन्हें असेंबली में एम्बेड किए गए संसाधनों के रूप में संग्रहीत करने के बारे में सोच रहा हूं। क्या यह सही तरीका है?

मैं एक्सएएमएल में कैसे निर्दिष्ट करूं कि छवि नियंत्रण को छवि को एम्बेडेड संसाधन से लोड करना चाहिए?


यह काम किया

और सेट करने के लिए छवियों गुणों में संसाधन है

    var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
                                      IntPtr.Zero,
                                      Int32Rect.Empty,
                                      BitmapSizeOptions.FromEmptyOptions());
    MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;

हाँ यह सही तरीका है। आप पथ का उपयोग कर संसाधन फ़ाइल में छवियों का उपयोग कर सकते हैं

<StackPanel Orientation="Horizontal">
    <CheckBox  Content="{Binding Nname}" IsChecked="{Binding IsChecked}"/>
    <Image Source="E:\SWorking\SharePointSecurityApps\SharePointSecurityApps\SharePointSecurityApps.WPF\Images\sitepermission.png"/>
    <TextBlock Text="{Binding Path=Title}"></TextBlock>
</StackPanel>

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


कुछ लोग कोड में ऐसा करने के बारे में पूछ रहे हैं और जवाब नहीं दे रहे हैं।

कई घंटों की खोज करने के बाद मुझे एक बहुत ही सरल विधि मिली, मुझे कोई उदाहरण नहीं मिला और इसलिए मैं यहां अपना हिस्सा साझा करता हूं जो छवियों के साथ काम करता है। (मेरा एक .gif था)

सारांश:

यह एक बिटमैप फ्रेम देता है जो छविसोर्स "गंतव्यों" जैसा प्रतीत होता है।

उपयोग:

doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");

तरीका:

static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
    Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
    return BitmapFrame.Create(oUri);
}

सीख:

मेरे अनुभवों से पैक स्ट्रिंग समस्या नहीं है, अपनी स्ट्रीम जांचें और विशेष रूप से यदि इसे पहली बार पढ़ना है तो फ़ाइल के अंत में पॉइंटर सेट कर दिया गया है और आपको इसे पढ़ने से पहले शून्य पर फिर से सेट करने की आवश्यकता है।

मुझे उम्मीद है कि यह आपको कई घंटों तक बचाएगा जो मैं चाहता हूं कि यह टुकड़ा मेरे लिए था!


यदि आप कई स्थानों पर छवि का उपयोग करेंगे, तो छवि छवि को केवल स्मृति में लोड करने के लायक है और फिर इसे सभी Image तत्वों के बीच साझा करना उचित है।

ऐसा करने के लिए, किसी संसाधन के रूप में BitmapSource स्रोत बनाएं:

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />

फिर, अपने कोड में, कुछ इस तरह का उपयोग करें:

<Image Source="{StaticResource MyImageSource}" />

मेरे मामले में, मैंने पाया कि मुझे Image.png फ़ाइल को केवल Content बजाय Resource की एक बिल्ड कार्रवाई करने के लिए सेट करना था। यह छवि को आपके संकलित असेंबली के भीतर ले जाने का कारण बनता है।


पूर्ण विवरण संसाधनों का उपयोग कैसे करें: https://msdn.microsoft.com/en-us/library/aa970494(v=vs.100).aspx और उन्हें संदर्भित करने के लिए कैसे करें "WPF में पैक यूआरआई"

संक्षेप में, संदर्भित / संदर्भित असेंबली से संसाधनों का संदर्भ देने के साधन भी हैं


  1. विजुअल स्टूडियो 2010 प्रोफेशनल एसपी 1।
  2. .NET Framework 4 क्लाइंट प्रोफ़ाइल।
  3. पीएनजी छवि परियोजना गुणों पर संसाधन के रूप में जोड़ा गया।
  4. संसाधन फ़ोल्डर में नई फ़ाइल स्वचालित रूप से बनाई गई।
  5. संसाधन के लिए कार्रवाई सेट बनाएँ।

यह मेरे लिए काम किया:

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />

  1. अपनी परियोजना में फ़ोल्डर जोड़ें और "मौजूदा आइटम" के माध्यम से इन्हें चित्र जोड़ें।
  2. इस तरह के <Image Source="MyRessourceDir\images\addButton.png"/> : <Image Source="MyRessourceDir\images\addButton.png"/>
  3. एफ 6 (बिल्ड)




c# .net wpf embedded-resource