我第一次涉足WPF,并决定创建一个在系统托盘中运行的基本应用程序。我添加了一个winforms NotifyIcon,并且能够最小化到托盘并隐藏窗口,以便一切正常。
这是事情变得奇怪的地方。
我决定始终从任务栏隐藏应用程序,并始终在系统托盘中显示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;