应用背景: 自己写的WPF 窗口(派生于 Window 类) 。 窗口对应的xaml 如下:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="638" Width="850"
AllowsTransparency="true"
WindowStartupLocation="CenterScreen"
ResizeMode="NoResize"
Closed="handler_closed"
Loaded="LoadedMainWindow"
WindowStyle="None"
xmlns:local="clr-namespace:Controls"
UseLayoutRounding="True"
Name="mainWindow"
>
<Grid Width="850" Height="638" >
<Grid.RowDefinitions>
<RowDefinition Height="40*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Title Bar Layout -->
<StackPanel HorizontalAlignment="Right" Margin="0,0,4,0" Orientation="Horizontal" >
<!--local:MinimizeCloseButton 是自定义的最小化及关闭的按钮,这里知道是一个button 就行。-->
<local:MinimizeCloseButton x:Name="btnMinimize" Height="30" Width="30" Click="ControlBtnClick" MinimizeOrCloseStyle="Minimize" />
<local:MinimizeCloseButton x:Name="btnClose" Height="30" Width="30" Click="ControlBtnClick" MinimizeOrCloseStyle="Close" />
</StackPanel>
</Grid>
</Window>
这里的 WindowStyle="None" 使用没有默认的窗口标题栏,所以自己布局来画标题栏及最小化和关闭按钮。
重点的说就是,用自己定义的按钮来进行最小化到托盘,然后双击托盘菜单的时间恢复窗口。
==================================================================================================
最初的代码版本:
// 点击"最小化" 按钮时调用此函数
private void MinimizedClick()
{
this.WindowState = WindowState.Minimized;
this.ShowInTaskbar = false;
}
// 双击托盘菜单时调用此函数"恢复窗口“
private void RestoreWindow()
{
this.WindowState = WindowState.Normal;
this.ShowInTaskbar = true;
}
这样的代码如果不注意看觉得没有什么问题, 但是在win 8.1 系统,点击最小化时,你会发现在左下方会出现一个只有标题栏的窗口悬挂在任务栏上面
代码版本二:
因为版本一代码出现问题,所以干脆改用 隐藏窗口的思想来做,修改后如下:
// 点击"最小化" 按钮时调用此函数
private void MinimizedClick()
{
this.ShowInTaskbar = false;
//this.WindowState = WindowState.Minimized;
this.Hide();
}
// 双击托盘菜单时调用此函数"恢复窗口“
private void RestoreWindow()
{
this.Show();
this.ShowInTaskbar = true;
}
代码修改到这样,在Win 8.1 上运行也没有问题,但是经过测试发现, 这段代码在 XP 系统下还是有如此问题: 在最小化和恢复窗口的时候,这个窗口会闪烁两次的Bug。
代码版本三(最终修改版)
// 点击"最小化" 按钮时调用此函数
private void MinimizedClick()
{
//this.ShowInTaskbar = false; //删除这一行,否则在xp 系统会闪烁窗口再最小化
//this.WindowState = WindowState.Minimized;
this.Hide();
}
// 双击托盘菜单时调用此函数"恢复窗口“
private void RestoreWindow()
{
//this.ShowInTaskbar = true; //删除这一行,否则在xp 系统会闪烁窗口
this.Show();
this.Activate(); // 加入这一行,解决当窗口没有最小化,但在其他窗口下面时,用于置顶窗口
}