如何获取和设置WPF Page的页面位置与尺寸?
解决WPF Page中获取/设置窗口尺寸与位置的问题
这问题我太熟了!WPF里的Page本身并不是独立窗口,它得靠NavigationWindow或者Frame这类容器来承载,所以你直接在Page里找不到窗口级的属性和事件很正常,得先找到它的宿主窗口才行,给你一步步说怎么弄:
1. 先拿到Page的宿主窗口
Page本身没有窗口级的属性,所以第一步要获取承载它的Window实例。最稳妥的时机是在Page的Loaded事件里做这件事,因为此时页面已经成功加载到容器中了:
private Window _hostWindow; private void Page_Loaded(object sender, RoutedEventArgs e) { // 获取当前Page所在的宿主窗口 _hostWindow = Window.GetWindow(this); // 可以顺便绑定窗口的LocationChanged事件,监听位置变化 if (_hostWindow != null) { _hostWindow.LocationChanged += HostWindow_LocationChanged; } } // 窗口位置变化时的处理逻辑 private void HostWindow_LocationChanged(object sender, EventArgs e) { // 这里可以获取最新的窗口位置 double currentLeft = _hostWindow.Left; double currentTop = _hostWindow.Top; // 执行你需要的操作 }
2. 获取与设置窗口尺寸
拿到宿主窗口后,就可以直接用窗口的属性来操作尺寸了:
- 获取尺寸:用
_hostWindow.ActualWidth、_hostWindow.ActualHeight(实际渲染的真实尺寸),或者_hostWindow.Width、_hostWindow.Height(手动设置的尺寸值) - 设置尺寸:直接给
_hostWindow.Width和_hostWindow.Height赋值即可,比如:
// 设置窗口宽高为800x600 _hostWindow.Width = 800; _hostWindow.Height = 600;
另外,你已经用到的Page_SizeChanged事件也会在窗口尺寸变化时触发,因为Page会跟着窗口容器一起调整大小,如果你只需要页面自身的尺寸,直接在这个事件里用this.ActualWidth、this.ActualHeight也完全可行。
3. 获取与设置窗口位置
同样通过宿主窗口的属性来操作:
- 获取位置:读取
_hostWindow.Left和_hostWindow.Top即可拿到窗口左上角的坐标 - 设置位置:直接给这两个属性赋值,比如:
// 将窗口移动到屏幕左上角 _hostWindow.Left = 0; _hostWindow.Top = 0;
额外注意事项
- 记得在Page卸载的时候解绑
LocationChanged事件,避免内存泄漏:
private void Page_Unloaded(object sender, RoutedEventArgs e) { if (_hostWindow != null) { _hostWindow.LocationChanged -= HostWindow_LocationChanged; } }
- 如果你的Page是嵌套在Frame里,而Frame又放在其他窗口中,
Window.GetWindow(this)依然能正确找到最外层的宿主窗口,不用额外做嵌套层级的处理。
内容的提问来源于stack exchange,提问作者Sandra K
相关产品推荐
相关产品推荐

