it-swarm-pt.tech

Como uso um ícone que é um recurso no WPF?

Eu tenho um arquivo .ico que é incorporado como um recurso (ação de compilaçã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
64
ScottG

Seu arquivo de ícone deve ser adicionado a um dos seus assemblies de 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 );
100
user13125

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 fazer isso, adicione a imagem aos recursos do projeto e use o seguinte:

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">
20
Thomas Bratt

Bem, você não deseja usar os recursos do estilo resx: basta colocar o arquivo ico no seu projeto em uma pasta (digamos "ArtWork") e nas propriedades, defina a Ação de compilação como "Recursos" ...

Em seguida, você pode referenciá-lo no XAML usando URIs do PACK ... "pack: // application: ,/Artwork/Notify.ico"

Consulte aqui: http://msdn.Microsoft.com/en-us/library/aa970069.aspx e o exemplo

Se você quiser ser um pouco mais ... parecido com o WPF, deve procurar no projeto WPF Contrib no CodePlex que possui um controle NotifyIcon que você pode criar no XAML e que usa menus WPF padrão (para que você possa colar "qualquer coisa" no menu).

12
Jaykul

Se você está apenas procurando a resposta simples, acho que é aí que MyApp é o nome do seu aplicativo e onde é o nome do espaço para nome raiz do seu aplicativo. Você precisa usar a sintaxe do URI do pacote, mas não precisa ser tão complicado para 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">
2
Mike Sage

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). Essa solução não funciona com o Resource, mas você pode manipulá-lo. Coloquei isso no OnIntialized (), mas ele 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;
    }
1
blackSphere