2010-04-03 13 views
37

Tworzę niestandardowe okno dialogowe błędu w mojej aplikacji WPF i chcę użyć standard windows error icon. Czy mogę uzyskać ikonę specyficzną dla systemu operacyjnego z WPF? Jeśli nie, czy ktoś wie, gdzie uzyskać .pngs z ich przejrzystością? Czy wiesz, gdzie w systemie Windows można je wyodrębnić?Jak korzystać ze standardowych ikon ostrzeżeń/błędów systemu Windows w mojej aplikacji WPF?

Do tej pory moje wyszukiwania nie przyniosły niczego.

+0

Chcesz ten sam obraz, niezależnie od platformy, lub chcesz ikonę odpowiadającą aktualnej wersji systemu Windows (łącznie z przyszłymi wersjami)? –

+0

Idealnie, ikona, która wygląda jak standardowa ikona dla tej wersji systemu Windows. Ale mogę zadowalać się uzyskaniem standardu dla Vista/7. – RandomEngy

Odpowiedz

32

Istnieje klasa SystemIcons, ale wymaga dostosowania do potrzeb WPF (tj. konwersja Icon na ImageSource).

+1

Całkowicie zrezygnowałeś z potrzeby p/invoke. Dobra decyzja. –

+3

przy okazji, http://stackoverflow.com/questions/1127647/convert-system-drawing-icon-to-system-media-imagesource, to może pomóc –

+3

Ten drugi wątek ma o cztery kroki za dużo. Użyj http://msdn.microsoft.com/en-us/library/system.windows.interop.imaging.createbitmapsourcefromhicon(v=VS.90).aspx –

6

W Visual Studio użyj Plik + Otwórz + Plik i wybierz c: \ windows \ system32 \ user32.dll. Otwórz węzeł Icon i kliknij dwukrotnie 103. Na moim komputerze jest to ikona Error. Wróć, kliknij prawym przyciskiem myszy i wybierz Eksportuj, aby zapisać plik.

To wulgarny sposób. Te ikony są również dostępne w Visual Studio. Z katalogu instalacyjnego programu Visual Studio przejdź do biblioteki Common7 \ VS2008ImageLibrary \ xxxx \ VS2008ImageLibrary.zip + VS2008ImageLibrary \ Adnotacje & Przyciski \ ico_format \ WinVista \ error.ico. Plik redist.txt w instalacji programu Visual Studio bezpośrednio jawnie daje prawo do używania tej ikony we własnej aplikacji.

+0

W rzeczywistości niezarządzane identyfikatory zasobów są # zdefiniowane w winuser.h i wkompilowane w dosłownie miliony programów. Więc się nie zmieniają. Indeks w bibliotece DLL, a nawet biblioteka DLL zawierająca ikony systemowe, może się zmienić, ale identyfikator zasobu nigdy się nie zmieni. –

+0

@Ben: nie, MB_ICONERROR ma wartość 0x10. Nie blisko identyfikatora zasobu. Ponownie: jeśli masz specjalną wiedzę o tym, jak to działa, puhleze, zamieść własną odpowiedź. –

+0

Wydajesz się zdeterminowany, aby zrobić wszystko osobiście, zamiast pozwolić, aby każdy temat techniczny pozostał sam. W tym konkretnym przypadku możesz się uczyć, czytając odpowiedź, którą pisałem, kiedy pisałeś ją na kilka godzin przed komentarzem. Identyfikator zasobu OIC_HAND lub równoważny OIC_ERROR, który jest używany z makrem MAKEINTRESOURCE, nie zmienił się od czasu wprowadzenia LoadImage i nigdy nie może, ponieważ jest skompilowany w miliony programów. –

29

Informacje o korzystaniu z Standard Microsoft Icons.

Zdecydowana większość programistów nie wie, że Visual Studio ma bibliotekę obrazów. Oto dwa linki, które ją wyróżniają:

Informacje o korzystaniu z Microsoft Visual Studio 2010 Image Library.

Informacje o korzystaniu z Microsoft Visual Studio 2008 Image Library.

+1

Łącznie ze mną ... Dziękujemy! –

+1

Dziękuję za to, ale jeśli się nie mylę, musisz samodzielnie wyciąć każdą ikonę. Oooo! – greenoldman

1

Nie możesz po prostu użyć Windows API?

Delphi Przykład:

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

Można użyć SystemIcons klasę .NET dla około trzech pierwszych kroków, jeśli domyślny rozmiar jest ok, patrz modosansreves answer

więc może to być tak proste, jak:

Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle) 
0

można narysować go tak:

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

... brak 'grafiki' w WPF. To, co napisałeś, dotyczy GDI. –

+0

GDI + faktycznie, ale prawdą jest, że nikt z nas nie dostarczył jeszcze konwersji do obrazu WPF. Nie znam WPF, ale jestem pewien, że ktoś wie jak. –

0

użycie SystemIcons i konwertować je do ImageSource tak:

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

ten sposób użyłem ikonę System w XAML:

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

użyłem tego konwertera, aby włączyć ikonę do ImageSource :

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

Czy masz również niestandardową metodę rozszerzenia o nazwie ToImageSource()? Nie mogłem znaleźć niczego, co by to zrobiło. – RandomEngy

+0

Tak, zapomniałem o tym. Dodałem kod z metody rozszerzenia do samego konwertera. – run2thesun

1

Użyj tego:

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

Nie zapomnij dodać referencji System.Drawing do projektu z lokalizacji globalnej.

Wtedy to wykorzystać w 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> 
Powiązane problemy