2008-09-16 44 views
57

Tôi có tệp .ico được nhúng dưới dạng tài nguyên (xây dựng bộ hành động thành tài nguyên). Tôi đang cố tạo một NotifyIcon. Tôi có thể tham khảo biểu tượng của mình bằng cách nào?Làm cách nào để sử dụng biểu tượng là tài nguyên trong WPF?

notifyIcon = new NotifyIcon(); 
notifyIcon.Icon = ??  // my icon file is called MyIcon.ico and is embedded 
+0

Xem câu hỏi tương tự ở đây: [nhập liên kết mô tả ở đây] [1] [1]: http://stackoverflow.com/questions/1127647/convert-system-drawing- icon-to-system-media-imagesource – PatTheFrog

Trả lời

88

Tệp biểu tượng của bạn phải được thêm vào một trong các hội đồng dự án và Hành động xây dựng của bạn phải được đặt thành Tài nguyên. Sau khi thêm một tham chiếu đến assembly, bạn có thể tạo một NotifyIcon như thế này:

System.Windows.Forms.NotifyIcon icon = new System.Windows.Forms.NotifyIcon(); 
Stream iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/YourReferencedAssembly;component/YourPossibleSubFolder/YourResourceFile.ico")).Stream; 
icon.Icon = new System.Drawing.Icon(iconStream); 
+11

Đừng quên vứt bỏ iconStream khi biểu tượng được tạo. – devios1

+0

Nhờ ví dụ này tôi cuối cùng đã có được cách để có được một nguồn lực trong một hội đồng tham chiếu của ứng dụng của tôi: mới Uri ("gói: // ứng dụng: ,,,/YourReferencedAssembly; thành phần/YourPossibleSubFolder/YourResourceFile.ico") –

+0

cho phép biểu tượng có nhiều độ phân giải? – tofutim

9

Vâng, bạn không muốn sử dụng các nguồn tài nguyên phong cách resx: bạn chỉ cần dính vào file ico trong dự án của bạn trong một thư mục (cho phép nói "ArtWork") và trong các thuộc tính, hãy đặt Build Action thành "Resources" ...

Sau đó, bạn có thể tham chiếu nó trong XAML bằng cách sử dụng PACK URI ... "pack: // application: ,,,/Ảnh minh họa/Notify.ico"

Xem ở đây: http://msdn.microsoft.com/en-us/library/aa970069.aspxsample

Nếu bạn muốn có nhiều hơn một chút ... WPF giống như, bạn nên nhìn vào dự án WPF Contrib trên CodePlex có điều khiển NotifyIcon mà bạn có thể tạo trong XAML và sử dụng các menu WPF chuẩn (để bạn có thể dính "bất cứ điều gì "trong menu).

1

Tôi đã tạo một dự án ở đây và sử dụng tài nguyên được nhúng (hành động xây dựng đã được đặt thành Tài nguyên được nhúng, thay vì chỉ tài nguyên). Giải pháp này không hoạt động với Tài nguyên, nhưng bạn có thể điều khiển nó. Tôi đặt nó lên OnIntialized() nhưng không cần phải đến đó.

//IconTest = namespace; exclamic.ico = resource 
System.IO.Stream stream = this.GetType().Assembly.GetManifestResourceStream("IconTest.Resources.exclamic.ico"); 

    if (stream != null) 
    { 
     //Decode the icon from the stream and set the first frame to the BitmapSource 
     BitmapDecoder decoder = IconBitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.None); 
     BitmapSource source = decoder.Frames[0]; 

     //set the source of your image 
     image.Source = source; 
    } 
+1

Chỉ cần một FYI - tôi đọc trong bộ đào tạo MCTS MCF MCTS của tôi không sử dụng tài nguyên nhúng vì nó sử dụng một lược đồ quản lý tài nguyên khác mà ít có thể truy cập từ WPF. Bạn không chắc chắn điều đó có nghĩa là gì, nhưng chỉ cần đi qua – ScottG

+0

@ScottG Sử dụng URI có thể không hoạt động nếu bạn muốn tải tài nguyên trước khi cửa sổ chính được tạo.Vì vậy, bạn cần phải nhúng biểu tượng và được nạp như được mô tả bởi blackSphere. Trong trường hợp của tôi, tôi phải tải biểu tượng trong ApplicationContext của tôi cho ứng dụng khay của tôi. –

19

Mẫu sử dụng phổ biến là biểu tượng thông báo giống như biểu tượng của cửa sổ chính. Biểu tượng được định nghĩa là tệp PNG.

Để làm điều này, thêm hình ảnh vào nguồn lực của dự án và sau đó sử dụng như sau:

var iconHandle = MyNamespace.Properties.Resources.MyImage.GetHicon(); 
this.notifyIcon.Icon = System.Drawing.Icon.FromHandle(iconHandle); 

Trong XAML cửa sổ:

<Window x:Class="MyNamespace.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:local="clr-namespace:Seahorse" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="600" 
Icon="images\MyImage.png"> 
+2

Lưu ý rằng bạn nên thêm biểu tượng bằng cách sử dụng trình thiết kế Tài nguyên và sau đó đặt hành động xây dựng thành Tài nguyên để làm việc này. –

0

Nếu bạn chỉ là tìm kiếm câu trả lời đơn giản, Tôi nghĩ đây là nơi MyApp là tên ứng dụng của bạn và đó là tên không gian tên gốc cho ứng dụng của bạn. Bạn phải sử dụng cú pháp URI gói, nhưng nó không phải là phức tạp để kéo một biểu tượng ra khỏi các tài nguyên nhúng của bạn.

<Window x:Class="MyApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    Height="100" 
    Width="200" 
    Icon="pack://application:,,,/MyApp;component/Resources/small_icon.ico"> 
Các vấn đề liên quan