Открытие Winform из панели задач

У меня есть Winform, который изначально скрыт при запуске.

После этого пользователь может щелкнуть значок уведомления внизу и показать его, если он хочет, а когда он свернут, ему нужно вернуться в системный трей.

В трее запускается нормально - без проблем. Когда нажимаешь показать, первый раз хоть и появляется, потом на долю секунды как будто исчезает, потом возвращается. Так что, похоже, он немного мерцает.

Затем, когда вы сворачиваете его, он попадает в системный трей, как и должно быть, и это нормально. Однако, когда вы нажимаете, чтобы показать его снова (в любое время после того, как вы сделали это один раз), он как бы скользит либо из системного трея, либо из панели задач, я бы предпочел, чтобы он просто появлялся, без небольшой анимации.

public class Program : Form
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Program());
    }

    private NotifyIcon trayIcon;
    private ContextMenu trayMenu;

    public Program()
    {
        trayMenu = new ContextMenu();
        trayMenu.MenuItems.Add("Exit", OnExit);
        trayMenu.MenuItems.Add("Show", OnShow);
        trayIcon = new NotifyIcon();
        trayIcon.Text = "MyTrayApp";
        trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40);
        trayIcon.ContextMenu = trayMenu;
        trayIcon.Visible = true;
    }

    protected override void OnLoad(EventArgs e)
    {
        Visible = false;
        ShowInTaskbar = false;
        base.OnLoad(e);
    }

    protected override void OnResize(EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized)
        {
            Visible = false;
            ShowInTaskbar = false;
        }
        base.OnResize(e);
    }

    private void OnExit(object sender, EventArgs e)
    {
        Application.Exit();
    }

    private void OnShow(object sender, EventArgs e)
    {
        Visible = true;
        ShowInTaskbar = true;
        TopMost = true;
        WindowState = FormWindowState.Normal;
    }

    protected override void Dispose(bool isDisposing)
    {
        if (isDisposing)
        {
            trayIcon.Dispose();
        }
        base.Dispose(isDisposing);
    }
}

Любые указатели на то, как просто заставить его отображаться правильно, будут действительно оценены.

Обновить

Я нашел причину мерцания, это произошло, когда TopMost был установлен последним, после того, как он был показан, поэтому он перерисовывает его поверх, что имеет смысл.

Так что в нынешнем виде он просто появляется и исчезает без анимации.


person Bali C    schedule 03.01.2013    source источник
comment
вы можете отключить анимацию stackoverflow.com/questions/2185721/   -  person Wim Ombelets    schedule 03.01.2013
comment
Это просто пустая форма, поэтому вы можете скопировать и вставить код, чтобы понять, что я имею в виду.   -  person Bali C    schedule 03.01.2013


Ответы (1)


РЕДАКТИРОВАТЬ: вы должны установить только свойство Visibility в Onload(), просто используйте Show() и Hide(), чтобы избежать анимации, и обязательно измените WindowState соответствующим образом.

Я поместил ваш код в обычный Form (не в файл Program.cs) и удалил весь лишний код. Это то, что у меня получилось, и оно не показывает «двойную» анимацию.

public partial class Form1 : Form
    {
        private NotifyIcon trayIcon;
        private ContextMenu trayMenu;

        public Form1()
        {
            InitializeComponent();

            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Name = "Program";

            trayMenu = new ContextMenu();
            trayMenu.MenuItems.Add("Exit");
            trayMenu.MenuItems.Add("Show", FormShow);
            trayIcon = new NotifyIcon();
            trayIcon.Text = "MyTrayApp";
            trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40);
            trayIcon.ContextMenu = trayMenu;
            trayIcon.Visible = true;
            TopMost = true;
            Resize += new EventHandler(Form1_Resize);
        }

        void Form1_Resize(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                ShowInTaskbar = false;
                Hide();
                trayIcon.Visible = true;
            }
        }

        void FormShow(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                WindowState = FormWindowState.Normal;
            }
            ShowInTaskbar = true;
            Show();
            Focus();
            trayIcon.Visible = false;
        }

        protected override void OnLoad(EventArgs e)
        {
            Visible = false;
            ShowInTaskbar = false;
        }
    }
person Wim Ombelets    schedule 03.01.2013
comment
К сожалению, это запускает приложение в свернутом виде на панели задач, спасибо. - person Bali C; 03.01.2013
comment
Спасибо. Это решило проблему мерцания, но у меня все еще есть некоторые проблемы. Когда форма восстанавливается, она не имеет фокуса (хотя TopMost = true и когда она была восстановлена, свернута, а затем снова восстановлена ​​(более одного раза), она начинает сворачиваться. Есть идеи? Спасибо - person Bali C; 03.01.2013
comment
Отредактировал ответ. Работает на меня. - person Wim Ombelets; 03.01.2013