2010-04-03 14 views
37

Tôi đang tạo hộp thoại báo lỗi tùy chỉnh trong ứng dụng WPF của mình và tôi muốn sử dụng standard windows error icon. Tôi có thể lấy biểu tượng dành riêng cho hệ điều hành từ WPF không? Nếu không, có ai biết nơi để có được .pngs với sự minh bạch của họ? Hoặc biết nơi nào trong Windows để giải nén chúng từ đâu?Làm cách nào để sử dụng các biểu tượng cảnh báo/lỗi chuẩn của Windows trong ứng dụng WPF của tôi?

Cho đến nay, các tìm kiếm của tôi không hiển thị.

+0

Bạn có muốn cùng một hình ảnh bất kể nền tảng, hay bạn muốn vào biểu tượng tương ứng với phiên bản hiện tại của Windows (bao gồm cả các phiên bản trong tương lai)? –

+0

Lý tưởng nhất, một biểu tượng trông giống như biểu tượng chuẩn cho phiên bản Windows đó. Nhưng tôi có thể giải quyết cho chỉ cần nhận được tiêu chuẩn cho Vista/7. – RandomEngy

Trả lời

32

Có lớp học SystemIcons nhưng cần điều chỉnh cho nhu cầu WPF (tức là chuyển đổi Icon thành ImageSource).

+1

Bạn hoàn toàn làm giảm bớt nhu cầu p/invoke. Cuộc gọi tốt. –

+3

bằng cách này, http://stackoverflow.com/questions/1127647/convert-system-drawing-icon-to-system-media-imagesource, điều này có thể giúp –

+3

Chủ đề khác đó có khoảng bốn bước quá nhiều. Sử dụng http://msdn.microsoft.com/en-us/library/system.windows.interop.imaging.createbitmapsourcefromhicon(v=VS.90).aspx –

6

Trong Visual Studio, hãy sử dụng Tệp + Mở + Tệp và chọn c: \ windows \ system32 \ user32.dll. Mở nút Biểu tượng và nhấp đúp vào 103. Trên máy của tôi, đó là biểu tượng Lỗi. Quay lại, nhấp chuột phải vào nó và chọn Xuất để lưu nó vào một tệp.

Đó là cách thức hấp dẫn. Các biểu tượng này cũng có sẵn trong Visual Studio. Từ thư mục cài đặt Visual Studio của bạn, điều hướng đến Common7 \ VS2008ImageLibrary \ xxxx \ VS2008ImageLibrary.zip + VS2008ImageLibrary \ Chú thích & Nút \ ico_format \ WinVista \ error.ico. Tệp redist.txt trong Visual Studio cài đặt trực tiếp rõ ràng cung cấp cho bạn quyền sử dụng biểu tượng này trong ứng dụng của riêng bạn.

+0

Trên thực tế, ID tài nguyên không được quản lý đượC#defined trong winuser.h và được biên dịch thành hàng triệu chương trình ngay bây giờ. Vì vậy, họ không thay đổi. Chỉ mục trong DLL, và thậm chí cả DLL chứa các biểu tượng hệ thống có thể thay đổi, nhưng ID tài nguyên sẽ không bao giờ xảy ra. –

+0

@Ben: không, MB_ICONERROR có giá trị 0x10. Không gần với ID tài nguyên. Một lần nữa: nếu bạn có kiến ​​thức đặc biệt về cách thức hoạt động của nó thì hãy cố gắng trả lời câu trả lời của riêng bạn. –

+0

Bạn dường như quyết tâm làm mọi thứ cá nhân hơn là để cho mỗi chủ đề kỹ thuật đứng một mình. Trong trường hợp cụ thể này, bạn có thể tự học bằng cách đọc câu trả lời tôi đã gõ khi bạn đăng bài của bạn và vài giờ trước khi bình luận của bạn. ID tài nguyên OIC_HAND hoặc tương đương OIC_ERROR, được sử dụng với macro MAKEINTRESOURCE, đã không thay đổi kể từ khi LoadImage được giới thiệu và không bao giờ có thể, vì nó được biên dịch thành hàng triệu chương trình. –

29

Giới thiệu về sử dụng Standard Microsoft Icons.

Đại đa số các nhà phát triển không biết rằng Visual Studio đi kèm với Thư viện hình ảnh. Vì vậy, ở đây có hai liên kết làm nổi bật nó:

Giới thiệu về cách sử dụng Microsoft Visual Studio 2010 Image Library.

Giới thiệu về cách sử dụng Microsoft Visual Studio 2008 Image Library.

+1

Bao gồm cả tôi ... Cảm ơn bạn! –

+1

Cảm ơn bạn vì điều đó, nhưng nếu tôi không nhầm thì bạn phải tự mình cắt từng biểu tượng. Ouch! – greenoldman

1

Bạn không thể đơn giản sử dụng API Windows?

Delphi Ví dụ:

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

Bạn có thể sử dụng lớp SystemIcons NET cho khoảng ba bước đầu tiên nếu kích thước mặc định là ok, xem modosansreves answer

Vì vậy, nó có thể đơn giản như:

Imaging.CreateBitmapSourceFromHIcon(SystemIcons.Error.Handle) 
0

Bạn có thể vẽ nó như thế này:

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

... không có 'Graphics' trong WPF. Những gì bạn đã viết là dành cho GDI. –

+0

GDI + thực sự, nhưng đúng là không ai trong số chúng tôi chưa cung cấp chuyển đổi sang hình ảnh WPF. Tôi không quen thuộc với WPF nhưng tôi chắc chắn ai đó biết làm thế nào. –

0

sử dụng SystemIcons và chuyển đổi chúng sang một ImageSource như vậy:

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

Đây là cách tôi đã sử dụng một biểu tượng System trong XAML:

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

tôi đã sử dụng chuyển đổi này để biến một biểu tượng để 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

Bạn cũng có một phương thức mở rộng tùy chỉnh được gọi là ToImageSource()? Tôi không thể tìm thấy bất cứ điều gì được xây dựng trong đó sẽ làm điều đó. – RandomEngy

+0

Có, tôi quên mất điều đó. Tôi đã thêm mã từ phương thức mở rộng vào bộ chuyển đổi. – run2thesun

1

Sử dụng tính năng này:

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

Đừng quên thêm tham chiếu System.Drawing vào dự án của bạn từ vị trí chung.

Sau đó sử dụng này trong XAML của bạn:

<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> 
Các vấn đề liên quan