none
[C#] Formulário no canto da SystemTray igual o MEGA Download RRS feed

  • Pergunta

  • Quero saber, ao clicar em cima do ícone, como o MEGA Download:

    http://i.imgur.com/zbT6InH.jpg

    E fazer isso:

    http://i.imgur.com/7EdEP1M.jpg

    E depois que clicar fora, o formulário some.

    quarta-feira, 9 de dezembro de 2015 14:47

Respostas

  • Tu criaste um projeto com o namespace "TesteDeactivated" ou colaste dos meus exemplos?

    Se colou, o problema deve ser alguma diferença nos namespaces.

    De qualquer forma logo tento codar usando também um ícone no tray.


    Att., Rafael Simor

    • Marcado como Resposta Marcos SJ quarta-feira, 9 de dezembro de 2015 19:52
    quarta-feira, 9 de dezembro de 2015 19:17
  • Não, não. Esse namespace é do meu outro projeto. Podes me ajudar usando o Team Viewer?

    Acho que não vai ser necessário. Tente o seguinte:

                w1.Show();
                w1.Activate();


    Att., Rafael Simor

    • Sugerido como Resposta SimorC quarta-feira, 9 de dezembro de 2015 19:31
    • Marcado como Resposta Marcos SJ quarta-feira, 9 de dezembro de 2015 19:52
    quarta-feira, 9 de dezembro de 2015 19:23
  • Ae \o/

    Só para deixar documentado: o problema é que ao dar o .Show() pelo Notify, ele não dava foco na Window, então para chamar o evento "Deactivated", era necessário "Ativar" a Window antes.


    Att., Rafael Simor

    • Marcado como Resposta Marcos SJ quarta-feira, 9 de dezembro de 2015 19:52
    quarta-feira, 9 de dezembro de 2015 19:31

Todas as Respostas

  • Boa tarde.

    Se não me engano isso pode ser feito utilizando um menu de contexto e NotifyIcon (AQUI tem uma dúvida bem parecida, acredito que a resposta fique bem clara)

    Sobre a customização mais avançada deste menu eu já não sei como ficaria.


    Att., Rafael Simor

    quarta-feira, 9 de dezembro de 2015 16:35
  • Obrigado pela resposta, Rafael. Mas a minha dúvida é outra, estou criando um aplicativo em C# WPF. Já fiz tudo certinha pra ele ficar na bandeja e tal. Tem um menu de contexto, "Configurações" e "Sair". E ao clicar com o botão esquerdo, ele aparece esse formulário que estou querendo, só que não sei onde fazer isso. Eu fiz ele aparece com um form comum, só não sei fazer ele sumir ao clicar fora, que seria usando 'this.Hide()'.
    quarta-feira, 9 de dezembro de 2015 16:43
  • Ah, então acho que fica até mais fácil.

    Tente dar um override no evento OnDeactivated:

    protected override void OnDeactivated(EventArgs e)
        {
            base.OnDeactivated(e);
            Hide();
        }


    Att., Rafael Simor

    • Sugerido como Resposta SimorC quarta-feira, 9 de dezembro de 2015 17:59
    • Não Sugerido como Resposta SimorC quarta-feira, 9 de dezembro de 2015 18:00
    quarta-feira, 9 de dezembro de 2015 16:50
  • Tentei fazer o mesmo e fui surpreendido com este erro:

    http://prntscr.com/9c7eq2

    quarta-feira, 9 de dezembro de 2015 17:26
  • Tente somente com o "Hide()" ou "Close()"; talvez o chamar o base seja desnecessário.


    Att., Rafael Simor

    quarta-feira, 9 de dezembro de 2015 17:32
  • Agora deu certo. Muito obrigado Rafael! :D
    quarta-feira, 9 de dezembro de 2015 17:36
  • Ops, funcionou certo mas só funcionou dentro da outra form, se eu clicar fora dessa form ele não some :x
    quarta-feira, 9 de dezembro de 2015 17:39
  • Ops, funcionou certo mas só funcionou dentro da outra form, se eu clicar fora dessa form ele não some :x

    Não entendi. Poderias explicar melhor?

    Edit: Se estiver usando um .ShowDialog(), tente trocar por .Show();


    Att., Rafael Simor


    • Editado SimorC quarta-feira, 9 de dezembro de 2015 18:03
    quarta-feira, 9 de dezembro de 2015 18:01
  • Primeiramente, desculpa aí por muitas duvidas... voltando, sim, eu já troquei por .Show(), eu fiz tudo certo, mas daí quando clico no ícone da bandeja, ele mostra o form, e quando eu clico fora ele não desaparece, ele só some quando eu clico fora e dentro da outra form. Olha só:

    http://i.imgur.com/rc9e0Hz.jpg

    Eu quero que ele suma quando eu clicar fora em qualquer lugar. Deu pra entender um pouco?


    quarta-feira, 9 de dezembro de 2015 18:11
  • Primeiramente, não precisa se desculpar por tentar resolver alguma dúvida; todos temos/tivemos dúvidas e não é um fardo quando outras pessoas tentam ajudar - na real até quem tenta tirar a dúvida acaba aprendendo também.

    Voltando...

    Eu testei aqui e deu certo, porém no lugar de dar o override, chamei diretamente o evento Window_Deactivated (neste caso, não esqueça de colocar a referência do evento no xaml:

    // Window Principal
    public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                Popup frmPopup = new Popup();
                frmPopup.Show();
            }
        }
    // Window "popup"
    public partial class Popup : Window
        {
            public Popup()
            {
                InitializeComponent();
            }
    
            private void Window_Deactivated(object sender, EventArgs e)
            {
                Close();
            }
        }
    Title="Popup" Height="300" Width="300" Deactivated="Window_Deactivated">

    Funciona em qualquer momento que a Window perde o "foco", ou seja: clicando em qualquer local fora da Window (se continuar não dando certo, tente o evento LostFocus também, pode ser que ajude).


    Att., Rafael Simor

    • Sugerido como Resposta SimorC quarta-feira, 9 de dezembro de 2015 18:45
    quarta-feira, 9 de dezembro de 2015 18:21
  • Obrigado, Rafael. Eu criei um outro projeto só para testar e deu certo. Vou ver qual é o erro do meu projeto principal.
    quarta-feira, 9 de dezembro de 2015 18:30
  • Ótimo!

    - Verifique se não tem nenhum evento impedindo que a janela seja desativada/perca o foco.

    - Coloque um breaking point no evento Deactivated para ver se ele está sendo chamado.

    - Caso tenha colocado o evento diretamente pela Window

    private void Window_Deactivated(object sender, EventArgs e)

    não esqueça de tirar o override do Deactivated.


    Att., Rafael Simor

    quarta-feira, 9 de dezembro de 2015 18:48
  • Form principal:

    using Hardcodet.Wpf.TaskbarNotification;

    namespace TesteDeactivate {

    /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { TaskbarIcon Ti = new TaskbarIcon(); public MainWindow() { InitializeComponent(); Ti.ToolTip = "Mensagem do tooltip"; Ti.TrayLeftMouseDown += new RoutedEventHandler(JanelaSystemTray); } public void JanelaSystemTray(object sender, RoutedEventArgs e) { Window1 w1 = new Window1(); w1.Show(); } } }

    Form para ser aberta:

    using Hardcodet.Wpf.TaskbarNotification;

    namespace TesteDeactivate { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void Window_Deactivated(object sender, EventArgs e) { Close(); } } }

    E desse modo não está funcionando, não consigo achar o erro :/


    quarta-feira, 9 de dezembro de 2015 18:57
  • Colocaste a referência do evento na tag de abertura da Window?

    <Window x:Class="TesteDeactivated.Popup"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Popup" Height="300" Width="300" Deactivated="Window_Deactivated">

    Att., Rafael Simor

    quarta-feira, 9 de dezembro de 2015 19:01
  • Sim, coloquei sim. No Window1 que seria a popup.

    <Window x:Class="TesteDeactivate.Window1"
            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"
            xmlns:local="clr-namespace:TesteDeactivate"
            mc:Ignorable="d"
            Title="Window1" Height="300" Width="300" Deactivated="Window_Deactivated">

    quarta-feira, 9 de dezembro de 2015 19:05
  • Tu criaste um projeto com o namespace "TesteDeactivated" ou colaste dos meus exemplos?

    Se colou, o problema deve ser alguma diferença nos namespaces.

    De qualquer forma logo tento codar usando também um ícone no tray.


    Att., Rafael Simor

    • Marcado como Resposta Marcos SJ quarta-feira, 9 de dezembro de 2015 19:52
    quarta-feira, 9 de dezembro de 2015 19:17
  • Não, não. Esse namespace é do meu outro projeto. Podes me ajudar usando o Team Viewer?

    quarta-feira, 9 de dezembro de 2015 19:19
  • Não, não. Esse namespace é do meu outro projeto. Podes me ajudar usando o Team Viewer?

    Acho que não vai ser necessário. Tente o seguinte:

                w1.Show();
                w1.Activate();


    Att., Rafael Simor

    • Sugerido como Resposta SimorC quarta-feira, 9 de dezembro de 2015 19:31
    • Marcado como Resposta Marcos SJ quarta-feira, 9 de dezembro de 2015 19:52
    quarta-feira, 9 de dezembro de 2015 19:23
  • Aeeeeeeeee! Funcionou! Muuuuuuuuuuutíssimo obrigado, Rafael! Boa sorte aí mano. :D
    quarta-feira, 9 de dezembro de 2015 19:28
  • Ae \o/

    Só para deixar documentado: o problema é que ao dar o .Show() pelo Notify, ele não dava foco na Window, então para chamar o evento "Deactivated", era necessário "Ativar" a Window antes.


    Att., Rafael Simor

    • Marcado como Resposta Marcos SJ quarta-feira, 9 de dezembro de 2015 19:52
    quarta-feira, 9 de dezembro de 2015 19:31
  • Entendi. Você tem skype, cara?
    quarta-feira, 9 de dezembro de 2015 19:36