WPF 自定义最小化窗口 的一些易错点

应用背景: 自己写的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();   // 加入这一行,解决当窗口没有最小化,但在其他窗口下面时,用于置顶窗口
        }




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值