获取WPF窗口标题栏高度

1、直接调用参数。

SystemParameters.WindowCaptionHeight

此值是系统标题栏的高度,只在窗口最大化时准确,Normal状态标题栏比这高。

2、累加计算

SystemParameters.WindowCaptionHeight+SystemParameters.WindowResizeBorderThickness.Left + SystemParameters.WindowNonClientFrameThickness.Left

实测可计算Normal状态标题栏高度,还有类似的调用系统参数的计算方法。此方法本人无法准确理解参数含义,不能放心使用。

3、间接计算

        private double GetCaptionHeight()
        {
            // 通过计算窗口顶部Y值与窗口内根元素Grid的Y值差来获取标题栏实际高度。
            var captionTop = this.Top;   // 窗口normal状态顶部坐标
            if (this.WindowState == WindowState.Maximized)
            {
                // 窗口Maximized状态下,this.Top依然是normal状态下的值,实际设为0。
                // 注意:主屏幕最大化时顶部坐标为0,副屏幕未必是,需要特别计算。
                captionTop = 0;
            }
            // 标题栏底部坐标为根元素Grid(或别的)的顶部坐标
            // 通过PointFromScreen计算屏幕原点相对Grid原点的位置。
            // 注意:不能用PointToScreen,这个函数是把屏幕当参照系,但不计算屏幕缩放。
            var captionBottom = -(this.Content as Grid).PointFromScreen(new Point(0, 0)).Y;
            return captionBottom - captionTop;
        }

        此方法为个人编写,如有雷同,纯属巧合。

总结:2、3的结果有时不相等,会有小数级别的差异,个人认为与屏幕缩放有关。我会选择第3种方法,更有确定性。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
感谢您的问题。以下是使用 WPF 修改窗口标题栏颜色的代码: 1. 添加以下命名空间: using System.Runtime.InteropServices; using System.Windows.Media; 2. 在窗口类中添加以下代码: [DllImport("user32.dll")] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] public static extern IntPtr ReleaseCapture(); private const uint WM_NCLBUTTONDOWN = 0xA1; private const uint HT_CAPTION = 0x2; private const int GWL_STYLE = -16; private const int WS_SYSMENU = 0x80000; private void SetTitleBarColor(Color color) { // 获取窗口句柄 IntPtr hWnd = new WindowInteropHelper(this).Handle; // 获取当前窗口样式 int style = GetWindowLong(hWnd, GWL_STYLE); // 去掉系统菜单样式 SetWindowLong(hWnd, GWL_STYLE, style & ~WS_SYSMENU); // 让非客户区可拖动 MouseDown += (s, e) => { if (e.LeftButton == MouseButtonState.Pressed) { ReleaseCapture(); SendMessage(hWnd, WM_NCLBUTTONDOWN, new IntPtr(HT_CAPTION), IntPtr.Zero); } }; // 修改颜色 Microsoft.Windows.Shell.WindowChrome.SetWindowChrome(this, new Microsoft.Windows.Shell.WindowChrome { CaptionHeight = 0, GlassFrameThickness = new Thickness(0), CornerRadius = new CornerRadius(0), UseAeroCaptionButtons = false, ResizeBorderThickness = new Thickness(0), NonClientFrameEdges = NonClientFrameEdges.None }); Background = new SolidColorBrush(color); } 3. 在窗口初始化方法中调用 SetTitleBarColor: public MainWindow() { InitializeComponent(); SetTitleBarColor(Color.FromRgb(255, 0, 0)); // 这里设置为红色 } 希望上述代码对您有帮助。如果您有其他问题,欢迎随时向我提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值