我第一次涉足 WPF,并决定创建一个基本应用程序以在系统托盘中运行。我添加了一个 winforms NotifyIcon 并且能够最小化到托盘并隐藏窗口,以便一切正常。
这就是事情变得奇怪的地方。
我决定始终从任务栏中隐藏应用程序,并始终notifyicon
在系统托盘中显示。我添加了单击事件处理程序,以便在窗口打开时单击通知图标会导致它隐藏,然后在它关闭时单击会导致它显示,非常标准的东西。
最后,窗口开始最小化到托盘。
所以,我启动我的应用程序,我只有一个系统托盘图标。我单击它,窗口将按您的预期显示。我再次单击通知图标,窗口再次消失,正如您所怀疑的那样。我第三次单击它,而不是弹出窗口,我只在左下角看到标题栏(左上角的图标,右上角的最小化/关闭按钮等)。我相信这是“崩溃”的行为。让这件事变得奇怪的最后一件事是我正在使用WindowLayout = none
所以我的窗口甚至没有标题栏..但一个显示在左下角。
如果我第四次单击,该栏就会消失。等等。
所以隐藏/显示是第一次工作,之后就变得很奇怪。
真的在这个问题上摸不着头脑。有人见过这样的事情或有什么建议吗?
https://stackoverflow.com/questions/12088892/impossible-to-restore-application-hidden-programmatically 这个家伙几乎完全解释了我所看到的行为,但不幸的是他没有回答他的问题。
这是XAML:
<Window x:Class="Tagalong.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Tagalong Beta .1" Height="350" Width="500" Icon="content/tagalong_icon.ico"
ResizeMode="CanMinimize" Topmost="True"
WindowStyle="None" Background="Transparent" AllowsTransparency="True" ShowInTaskbar="false" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250" />
<ColumnDefinition Width="250" />
</Grid.ColumnDefinitions>
<Border Name="LeftPane" Grid.Row="0" Grid.Column="0" BorderBrush="Black"
BorderThickness="1.5" Height="350" Width="250" CornerRadius="10" Background="Blue" >
<Grid>
</Grid>
</Border>
<Border Name="RightPane" BorderBrush="Black" Grid.Row="0" Grid.Column="1"
BorderThickness="1.5" Height="350" Width="250" CornerRadius="10" Background="Green">
<Grid>
</Grid>
</Border>
</Grid>
</Window>
这是代码:
void InitializeSystemTrayOptions()
{
notifyIcon = new NotifyIcon();
notifyIcon.Icon = new System.Drawing.Icon(@"C:\dev\desktop\Tagalong\Tagalong\tagalong_icon.ico");
notifyIcon.MouseClick += new System.Windows.Forms.MouseEventHandler(notifyIcon_MouseClick);
notifyIcon.Visible = true;
this.Visibility = Visibility.Hidden;
this.WindowState = WindowState.Minimized;
}
void notifyIcon_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (this.WindowState == WindowState.Normal)
{
this.WindowState = WindowState.Minimized;
this.Visibility = Visibility.Hidden;
}
else if (this.WindowState == WindowState.Minimized)
{
this.WindowState = WindowState.Normal;
this.Visibility = Visibility.Visible;
}
}
}
private NotifyIcon notifyIcon;