Como uso um ícone que é um recurso no WPF?
Pergunta
Eu tenho um arquivo .ico incorporado como um recurso (ação de construção definida como recurso).Estou tentando criar um NotifyIcon.Como posso fazer referência ao meu ícone?
notifyIcon = new NotifyIcon();
notifyIcon.Icon = ?? // my icon file is called MyIcon.ico and is embedded
Solução
Seu arquivo de ícone deve ser adicionado a um dos assemblies do seu projeto e sua ação de construção deve ser definida como Recurso.Depois de adicionar uma referência ao assembly, você pode criar um NotifyIcon assim:
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 );
Outras dicas
Um padrão de uso comum é ter o ícone de notificação igual ao ícone da janela principal.O ícone é definido como um arquivo PNG.
Para isso, adicione a imagem aos recursos do projeto e depois utilize da seguinte forma:
var iconHandle = MyNamespace.Properties.Resources.MyImage.GetHicon();
this.notifyIcon.Icon = System.Drawing.Icon.FromHandle(iconHandle);
Na janela 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">
Bem, você não quer usar os recursos do estilo resx:basta colar o arquivo ico do seu projeto em uma pasta (digamos "ArtWork") e nas propriedades, definir a ação de construção como "Recursos" ...
Então você pode referenciá-lo em XAML usando PACK URIs..."pacote://aplicativo:,,,/Artwork/Notify.ico"
Veja aqui: http://msdn.microsoft.com/en-us/library/aa970069.aspx e a amostra
Se você quiser ser um pouco mais...Semelhante ao WPF, você deve olhar para o Contribuição WPF projeto no CodePlex que possui um controle NotifyIcon que você pode criar em XAML e que usa menus WPF padrão (para que você possa colar "qualquer coisa" no menu).
Se você está apenas procurando uma resposta simples, acho que é aqui que MyApp é o nome do seu aplicativo e onde é o nome do namespace raiz do seu aplicativo.Você precisa usar a sintaxe do URI do pacote, mas não precisa ser tão complicado extrair um ícone de seus recursos incorporados.
<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">
Criei um projeto aqui e usei um recurso incorporado (a ação de construção foi definida como Recurso Incorporado, em vez de apenas recurso).Esta solução não funciona com Resource, mas você pode manipulá-la.Coloquei isso no OnIntialized() mas não precisa ir lá.
//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;
}