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
Foi útil?

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;
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top