Как использовать значок, который является ресурсом в WPF? - PullRequest
61 голосов
/ 16 сентября 2008

У меня есть файл .ico, который встроен в качестве ресурса (действие сборки установлено для ресурса). Я пытаюсь создать NotifyIcon. Как я могу сослаться на свою иконку?

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

Ответы [ 5 ]

96 голосов
/ 16 сентября 2008

Ваш файл значка должен быть добавлен в одну из сборок вашего проекта, а для его Действия по сборке должно быть установлено значение Ресурс. После добавления ссылки на сборку вы можете создать NotifyIcon следующим образом:

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 );
20 голосов
/ 09 декабря 2009

Обычный шаблон использования - значок уведомления должен совпадать со значком главного окна. Значок определяется как файл PNG.

Для этого добавьте изображение к ресурсам проекта, а затем используйте следующее:

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

В окне XAML:

<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">
12 голосов
/ 16 сентября 2008

Ну, вы не хотите использовать ресурсы в стиле resx: вы просто помещаете файл ico в свой проект в папку (скажем, «ArtWork») и в свойствах задаете для параметра «Действие сборки» значение «Ресурсы». ..

Затем вы можете ссылаться на него в XAML, используя PACK URIs ... "pack: // application: ,,, / Artwork / Notify.ico"

См. Здесь: http://msdn.microsoft.com/en-us/library/aa970069.aspx и образец

Если вы хотите быть немного более ... похожим на WPF, вам следует взглянуть на проект WPF Contrib на CodePlex, который имеет элемент управления NotifyIcon, который вы можете создать в XAML и который использует стандартные Меню WPF (чтобы вы могли вставить в меню «что угодно»).

2 голосов
/ 18 августа 2015

Если вы просто ищете простой ответ, я думаю, что именно здесь MyApp - это имя вашего приложения, а где - имя корневого пространства имен для вашего приложения. Вы должны использовать синтаксис пакета URI, но это не должно быть слишком сложно, чтобы извлечь значок из ваших встроенных ресурсов.

    <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">
1 голос
/ 16 сентября 2008

Я создал проект здесь и использовал встроенный ресурс (в качестве действия сборки было задано значение «Встроенный ресурс», а не просто ресурс). Это решение не работает с Resource, но вы можете манипулировать им. Я положил это на OnIntialized (), но он не должен идти туда.

//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;
    }
...