2

起動時に最初は非表示になっている 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は が最後に設定されたときに発生したため、 が表示された後、上に再描画されます。これは理にかなっています。

現状では、アニメーションなしで表示および非表示にするだけです。

4

1 に答える 1

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;
        }
    }
于 2013-01-03T13:29:11.323 に答える