WPF利用WindowChrome实现自定义窗口

简介

Microsoft官网关于 WindowChome 的介绍

截取Microsoft文章的一段话:

若要在保留其标准功能时自定义窗口,可以使用该 WindowChrome 类。 该 WindowChrome 类将窗口框架的功能与视觉对象分开,并允许你控制应用程序窗口的客户端和非客户端区域之间的边界。 通过 WindowChrome 该类,可以通过扩展工作区来覆盖非工作区,将 WPF 内容置于窗口框架中。 同时,它通过两个不可见区域保留系统行为: 调整边框 和 标题 区域的大小。

效果图

WPF利用WindowChrome实现自定义窗口_第1张图片

WPF利用WindowChrome实现自定义窗口_第2张图片

自定义最小化、最大化、关闭按钮

最小化按钮


最大化按钮


关闭按钮


/// 
/// 窗口移动
/// 
/// 
/// 
private void Move_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) => this.DragMove();

/// 
/// 最小化
/// 
/// 
/// 
private void BtnMin_Click(object sender, RoutedEventArgs e) => WindowState = WindowState.Minimized;

/// 
/// 最大化/还原
/// 
/// 
/// 
private void BtnMax_Click(object sender, RoutedEventArgs e) => WindowState = WindowState is WindowState.Normal ? WindowState.Maximized : WindowState.Normal;

/// 
/// 关闭
/// 
/// 
/// 
private void BtnClose_Click(object sender, RoutedEventArgs e) => Application.Current.Shutdown();

布局实现

首先我们需要在 MainWindow 也就是我们的主窗口中的 Window.Resources 中实现 WindowChrome 的基本样式:

WindowChrome.ResizeBorderThickness 设置不可见边框宽度

WindowChrome.CaptionHeight> 设置属于标题栏的范围——高度

WindowChrome.UseAeroCaptionButtons 是否启用默认系统按钮功能——三大金刚键

WindowChrome.NonClientFrameEdges 设置客户区域,使用 bottom 可以实现加载时空白窗口而不显示默认窗口,提升用户体验



    
        
            
                5
            
            60
            false
            bottom
        
    

重写窗口,实现最大化窗口下,标题栏及客户区域偏移问题的修正。

通过代码获取当前窗口的工作区域,及任务栏以外的其他区域

System.Windows.SystemParameters.WorkArea.Width 获取工作区域的宽

System.Windows.SystemParameters.WorkArea.Height 获取工作区域的高

为什么要使用 ValueConverter 主要是因为 WorkArea 返回的类型无法直接 binding xaml





using System;
using System.Globalization;
using System.Windows.Data;

namespace SignalRClient.ValueConverters
{
    internal class WorkAreaWidth : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return System.Windows.SystemParameters.WorkArea.Width;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
using System;
using System.Globalization;
using System.Windows.Data;

namespace SignalRClient.ValueConverters
{
    internal class WorkAreaHeight : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return System.Windows.SystemParameters.WorkArea.Height;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

结语

一开始,确实很难搞,Microsoft 的文档,里面也并没有,详细介绍窗口内容溢出的问题,但是只要仔细研究过 WPF 的同学都知道,很多东西是可以通过 Trigger 来实现的。Get 到这一点很多问题就迎刃而解了。

到此这篇关于WPF利用WindowChrome实现自定义窗口的文章就介绍到这了,更多相关WPF WindowChrome自定义窗口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(WPF利用WindowChrome实现自定义窗口)