Aplicativo WPF que possui apenas um ícone de bandeja


144

Eu sou um novato no WPF e me pergunto se alguém poderia me dar algumas dicas sobre como escrever um aplicativo que é minimizado na bandeja. A idéia é que ele busque periodicamente um RSS Feed e crie um Toaster-Popup quando houver novos feeds.

O aplicativo ainda deve ter uma janela principal (essencialmente apenas uma lista contendo todas as entradas de feed), mas que deve estar oculta por padrão.

Comecei a ler sobre XAML e WPF e sei que o StartupUri no App.xaml precisa apontar para minha janela principal, mas não tenho idéia de qual é a maneira correta de fazer o ícone do SysTray e ocultar a janela principal (isso também significa que, quando o usuário minimiza a janela, deve minimizar a bandeja, não a barra de tarefas).

Alguma dica?


3
Obrigado por todas as sugestões! O WPF-NotifyIcon é o que eu vou usar, pois um teste rápido mostra que é bastante promissor e indolor.
Michael Stum

Respostas:


114

Não há NotifyIcon para WPF.

Um colega meu usou esta biblioteca disponível gratuitamente com bons resultados:


2
Biblioteca fantástica. Mal posso esperar para utilizá-lo!
Rob Hay

2
Drew, o link parece ter morrido aqui. Você tem um link alternativo para esta biblioteca? Fiz uma pesquisa rápida, mas não consegui determinar se os resultados eram para o mesmo projeto.
Brad Larson

@ BradLarson, o site parece estar inativo; mas de qualquer forma o projeto está disponível como pacote Nuget (ver resposta de Dale)
Thomas Levesque

4
Não obstante o grande número de votos, essa resposta não constitui uma resposta útil e legítima do Stack Overflow. É efetivamente uma resposta apenas de link, contrária aos padrões do Stack Overflow. Melhore esta resposta fornecendo as informações específicas e materiais na própria resposta. Isso garantirá que as informações estejam disponíveis, independentemente do status do site externo.
Evan Larsen

107

Você precisa usar o controle NotifyIcon em System.Windows.Forms ou, em alternativa, pode usar a API de ícone do Notify fornecida pela API do Windows. O WPF não fornece esse equivalente e foi solicitado no Microsoft Connect várias vezes.

Eu tenho código no GitHub que usa o System.Windows.FormsComponente NotifyIcon de dentro de um aplicativo WPF, o código pode ser visualizado em https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs

Aqui estão os bits de resumo:

Crie uma janela WPF com ShowInTaskbar = False e que seja carregado em um estado não visível.

No nível da classe:

private System.Windows.Forms.NotifyIcon notifyIcon = null;

Durante OnInitialize ():

notifyIcon = new System.Windows.Forms.NotifyIcon();
notifyIcon.Click += new EventHandler(notifyIcon_Click);
notifyIcon.DoubleClick += new EventHandler(notifyIcon_DoubleClick);
notifyIcon.Icon = IconHandles["QuickLaunch"];

Durante OnLoaded ():

notifyIcon.Visible = true;

E para interação (mostrada como notifyIcon.Click e DoubleClick acima):

void notifyIcon_Click(object sender, EventArgs e)
{
    ShowQuickLaunchMenu();
}

A partir daqui, você pode retomar o uso de controles WPF e APIs, como menus de contexto, janelas pop-up etc.

É simples assim. Você não precisa exatamente de uma janela WPF para hospedar o componente, é apenas a maneira mais conveniente de introduzir uma em um aplicativo WPF (como uma janela geralmente é o ponto de entrada padrão definido pelo App.xaml), da mesma forma, você não precisa ' você precisa de um WPF Wrapper ou de controle de terceiros, pois o componente SWF é garantido presente em qualquer instalação do .NET Framework que também tenha suporte ao WPF, pois faz parte do .NET Framework (no qual todas as versões atuais e futuras do .NET Framework se baseiam.) Até o momento, não há indicação da Microsoft de que o suporte ao SWF seja retirado do .NET Framework tão cedo.

Espero que ajude.

É um pouco complicado você ter que usar um Componente do Framework anterior à 3.0 para obter um ícone de bandeja, mas, como a Microsoft explicou, não existe o conceito de Bandeja do Sistema no escopo do WPF. O WPF é uma tecnologia de apresentação e os ícones de notificação são um conceito de sistema operacional (não uma "apresentação").


2
Obrigado pela explicação detalhada!
Michael Stum

4
+1, essa deve ser a resposta selecionada apenas para a explicação.
ToastyMallows

2
Parabéns pelo último parágrafo. Era exatamente o que eu precisava saber e é esse nível de detalhes simples e perspicazes que parece um bom desenvolvedor.
Matthew Layton

1
A parte engraçada desse último parágrafo é "O WPF é apenas para Windows" agora é a desculpa da Microsoft para não criar o WPF entre plataformas no .NET Core. Portanto, é apenas o Windows, mas não o Windows, o suficiente para expor recursos específicos do Windows?
McGuireV10 27/01/19

1
Eu sou o único que não gosta de referências ao System.Windows.Forms no meu aplicativo WPF?
Joel

48

Recentemente, tive esse mesmo problema. Infelizmente, o NotifyIcon é apenas um controle Windows.Forms no momento, se você quiser usá-lo, precisará incluir essa parte da estrutura. Eu acho que depende de quanto você é um purista do WPF.

Se você deseja uma maneira rápida e fácil de começar, confira este controle WPF NotifyIcon no Code Project, que não depende do WinForms NotifyIcon. Uma versão mais recente parece estar disponível no site do autor e como um pacote NuGet . Esta parece ser a melhor e mais limpa maneira para mim até agora.

  • Dicas de ferramenta ricas em vez de texto
  • Menus de contexto e pop-ups do WPF
  • Suporte de comando e eventos roteados
  • Ligação de dados flexível
  • Mensagens ricas em balão, em vez das mensagens padrão fornecidas pelo sistema operacional

Confira. Ele também vem com um aplicativo de amostra incrível, muito fácil de usar, e você pode ter pop-ups, dicas de ferramentas e menus de contexto WPF com ótima aparência do Windows Live Messenger. Perfeito para exibir um feed RSS, estou usando-o para uma finalidade semelhante.


5
para novos operadores em 2017, que é obsoleto pacote NuGet ainda publicado sob um nome diferente como nuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.