gpt4 book ai didi

c# - 从任务栏打开 Winform

转载 作者:太空宇宙 更新时间:2023-11-03 13:49:23 29 4
gpt4 key购买 nike

我有一个 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 时,在 is 显示之后,所以它在顶部重绘,这是有道理的。

就目前而言,它只是让它在没有动画的情况下出现和消失。

最佳答案

编辑:您应该只在 Onload() 中设置 Visibility 属性,只需使用 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;
}
}

关于c# - 从任务栏打开 Winform,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139576/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com