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种方法,更有确定性。