2010-04-03 18 views
37

मैं अपने WPF ऐप में एक कस्टम त्रुटि संवाद कर रहा हूं और मैं standard windows error icon का उपयोग करना चाहता हूं। क्या मुझे डब्ल्यूपीएफ से ओएस-विशिष्ट आइकन मिल सकता है? यदि नहीं, तो क्या किसी को पता है कि उनके पास पारदर्शिता के साथ .pngs कहां प्राप्त करें? या पता है कि विंडोज़ में उन्हें निकालने के लिए कहां से निकालना है?मैं अपने डब्ल्यूपीएफ ऐप में मानक विंडोज चेतावनी/त्रुटि आइकन का उपयोग कैसे करूं?

अभी तक मेरी खोजों में कुछ भी नहीं हुआ है।

+0

आप एक ही छवि मंच की परवाह किए बिना चाहते हैं, या आप (भविष्य के संस्करणों सहित) विंडोज के वर्तमान संस्करण के लिए इसी आइकन चाहते हैं? –

+0

आदर्श रूप से, एक आइकन जो विंडोज के उस संस्करण के लिए मानक आइकन की तरह दिखता है। लेकिन मैं Vista/7 के लिए मानक प्राप्त करने के लिए बस सकता हूं। – RandomEngy

उत्तर

32

SystemIcons कक्षा है, लेकिन इसे WPF आवश्यकताओं के लिए समायोजन की आवश्यकता है (यानी। Icon से ImageSource में कनवर्ट करना)।

+1

आपने पूरी तरह से पी/आवेदक की आवश्यकता को रोक दिया। अच्छा निर्णय। –

+3

वैसे, http://stackoverflow.com/questions/1127647/convert-system-drawing-icon-to-system-media-imagesource, यह –

+3

की सहायता कर सकता है कि अन्य थ्रेड में लगभग चार कदम हैं। Http://msdn.microsoft.com/en-us/library/system.windows.interop.imaging.createbitmapsourcefromhicon(v=VS.90).aspx –

6

विजुअल स्टूडियो में, फ़ाइल + ओपन + फ़ाइल का उपयोग करें और c: \ windows \ system32 \ user32.dll का चयन करें। आइकन नोड खोलें और 103 पर डबल-क्लिक करें। मेरी मशीन पर त्रुटि आइकन है। पीछे, राइट-क्लिक करें और इसे फ़ाइल में सहेजने के लिए निर्यात का चयन करें।

यह iffy तरीका है। ये आइकन विजुअल स्टूडियो में भी उपलब्ध हैं। अपनी विजुअल स्टूडियो इंस्टॉल निर्देशिका से, कॉमन 7 \ VS2008ImageLibrary \ xxxx \ VS2008ImageLibrary.zip + VS2008ImageLibrary \ Annotations & बटन \ ico_format \ WinVista \ error.ico पर नेविगेट करें। विजुअल स्टूडियो इंस्टॉलेशन में redist.txt फ़ाइल सीधे आपको स्पष्ट रूप से इस आइकन का उपयोग अपने एप्लिकेशन में करने का अधिकार देती है।

+0

असल में अप्रबंधित संसाधन आईडी # winuser.h में परिभाषित हैं और अब तक लाखों कार्यक्रमों में संकलित हैं। तो वे बदल नहीं रहे हैं। डीएलएल के भीतर सूचकांक, और यहां तक ​​कि डीएलएल में सिस्टम आइकन शामिल हो सकते हैं, लेकिन संसाधन आईडी कभी नहीं होगी। –

+0

@ बेन: नहीं, MB_ICONERROR का मूल्य 0x10 है। संसाधन आईडी के नजदीक नहीं। दोबारा: यदि आपके पास यह विशेष ज्ञान है कि यह कैसे काम करता है, तो अपने स्वयं के उत्तर पोस्ट करें। –

+0

आप प्रत्येक तकनीकी विषय को अकेले खड़े होने की बजाय सबकुछ व्यक्तिगत बनाने के लिए दृढ़ प्रतीत होते हैं। इस विशेष मामले में, आप अपने द्वारा पोस्ट किए गए उत्तर को पढ़कर स्वयं को शिक्षित कर सकते हैं और आपकी टिप्पणी से कई घंटे पहले। संसाधन आईडी OIC_HAND या समकक्ष OIC_ERROR, जिसका उपयोग MAKEINTRESOURCE मैक्रो के साथ किया जाता है, लोडइमेज पेश नहीं किया गया था और कभी भी नहीं कर सकता है, क्योंकि यह लाखों प्रोग्रामों में संकलित है। –

29

Standard Microsoft Icons का उपयोग करने के बारे में।

वहां डेवलपर्स के विशाल बहुमत को पता नहीं है कि विजुअल स्टूडियो एक छवि लाइब्रेरी के साथ आता है। तो यहां दो लिंक हैं जो इसे हाइलाइट करते हैं:

Microsoft Visual Studio 2010 Image Library का उपयोग करने के बारे में।

Microsoft Visual Studio 2008 Image Library का उपयोग करने के बारे में।

+1

मुझे शामिल कर रहा है ... धन्यवाद! –

+1

इसके लिए धन्यवाद, लेकिन अगर मुझे गलत नहीं लगता है तो आपको अपने द्वारा प्रत्येक आइकन को काटना होगा। आउच! – greenoldman

1

क्या आप बस विंडोज एपीआई का उपयोग नहीं कर सकते?

डेल्फी उदाहरण:

procedure TForm1.FormClick(Sender: TObject); 
var 
    errIcon: HICON; 
begin 
    errIcon := LoadIcon(0, IDI_ERROR); 
    DrawIcon(Canvas.Handle, 10, 10, errIcon) 
end; 
4

यदि डिफ़ॉल्ट आकार ठीक है आप मोटे तौर पर पहले तीन चरणों के लिए नेट की SystemIcons वर्ग का उपयोग कर सकते इस्तेमाल किया, देखने modosansreves answer

तो यह रूप में सरल किया जा सकता है:

Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle) 
0

आप इसे इस तरह आकर्षित कर सकते हैं:

Graphics g = this.CreateGraphics(); 
g.DrawIcon(SystemIcons.Question, 40, 40); 
+1

... WPF में कोई ग्राफिक्स नहीं। आपने जो लिखा वह जीडीआई के लिए है। –

+0

जीडीआई + वास्तव में, लेकिन यह सच है कि हम में से कोई भी अभी तक एक WPF छवि में रूपांतरण प्रदान नहीं किया है। मैं डब्ल्यूपीएफ से परिचित नहीं हूं लेकिन मुझे यकीन है कि कोई जानता है कि कैसे। –

0

उपयोग SystemIcons और इतने की तरह एक ImageSource लिए उन्हें बदलने:

xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing" 
... 
<Image Source="{Binding Source={x:Static draw:SystemIcons.Warning}, 
     Converter={StaticResource IconToImageSourceConverter}, 
     Mode=OneWay}" /> 

मैं ImageSource करने के लिए एक चिह्न चालू करने के लिए इस कनवर्टर के लिए इस्तेमाल किया:

try 
{ 
    var temp = SystemIcons.WinLogo.ToBitmap(); //Your icon here 
    BitmapImage bitmapImage = new BitmapImage(); 
    using (MemoryStream memory = new MemoryStream()) 
    { 
     temp.Save(memory, ImageFormat.Png); 
     memory.Position = 0; 
     bitmapImage.BeginInit(); 
     bitmapImage.StreamSource = memory; 
     bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
     bitmapImage.EndInit(); 
    } 
    this.Icon = bitmapImage; 
} 
catch (Exception ex) 
{ 
    this.Icon = null; 
} 
5

यह कैसे मैं XAML में एक सिस्टम आइकन प्रयोग किया जाता है :

public class IconToImageSourceConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var icon = value as Icon; 
     if (icon == null) 
     { 
      Trace.TraceWarning("Attempted to convert {0} instead of Icon object in IconToImageSourceConverter", value); 
      return null; 
     } 

     ImageSource imageSource = Imaging.CreateBitmapSourceFromHIcon(
      icon.Handle, 
      Int32Rect.Empty, 
      BitmapSizeOptions.FromEmptyOptions()); 
     return imageSource; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

क्या आपके पास ToImageSource() नामक कस्टम एक्सटेंशन विधि भी है? मुझे उसमें कुछ भी नहीं मिला जो वह करेगा। – RandomEngy

+0

हां मैं इसके बारे में भूल गया। मैंने एक्सटेंशन विधि से कनवर्टर में कोड जोड़ा। – run2thesun

1

उपयोग करें:

using System; 
using System.Drawing; 
using System.Windows; 
using System.Windows.Interop; 
using System.Windows.Markup; 
using System.Windows.Media.Imaging; 

using Extensions 
{ 
    [ContentProperty("Icon")] 
    public class ImageSourceFromIconExtension : MarkupExtension 
    { 
     public Icon Icon { get; set; } 

     public ImageSourceFromIconExtension() 
     { 
     } 

     public ImageSourceFromIconExtension(Icon icon) 
     { 
      Icon = icon; 
     } 

     public override object ProvideValue(IServiceProvider serviceProvider) 
     { 
      return Imaging.CreateBitmapSourceFromHIcon(Icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 
     } 
    } 
} 

सिस्टम जोड़ने के लिए मत भूलना। वैश्विक स्थान से अपनी परियोजना के संदर्भ को रोकना।

फिर अपने XAML में इस का उपयोग करें:

<WindowOrSomething x:Class="BlaBlaWindow" 
    xmlns:draw="clr-namespace:System.Drawing;assembly=System.Drawing" 
    xmlns:ext="clr-namespace:Extensions"> 
    <Image Source="{ext:ImageSourceFromIcon {x:Static draw:SystemIcons.Error}}"/> 
</WindowOrSomething> 
संबंधित मुद्दे