如果我将SizeToContent
设置为WidthAndHeight
,则WindowStartupLocation="CenterOwner"
无法正常工作。而不是新窗口的中心位于其父主的中心,它看起来更像是子窗口的左上角位于父窗口的中心。 如果我删除SizeToContent
那么一切正常。 有什么不对?wpf中心子窗口不能与大小写工作
回答
当一个窗口被显示,则测量它,然后使用由测量过程计算的窗口的ActualWidth
和ActualHeight
来处理WindowStartupLocation
。
您描述的行为告诉我ActualWidth
和ActualHeight
在Show()或ShowDialog()调用时测量为零或相对较小,并且稍后设置为非零值。
例如,如果窗口的内容是使用仅在Loaded
事件上设置的DataContext构建的,则可能发生这种情况。当调用Show()
时,该窗口尚未被Loaded
尚未存在,因此它没有数据。后来当Loaded
事件触发时,它设置DataContext并且窗口更新其内容,但定位已经发生。
还有很多其他场景,例如使用Dispatcher.BeginInvoke调用填充的内容,或者从单独的线程填充的内容,或者延迟或异步的绑定。
基本上你需要寻找任何可能导致你的窗口内容比目前的Show()
被调用时更小的内容,并修复它。
你的问题有点含糊。你在哪个窗口(“父”或“孩子”)设置SizeToContent和WindowStartupLocation?
如果我在我的项目中创建第二个窗口并按照您描述的方式设置其SizeToContent和WindowStartupLocation,我会得到所需的结果。
我能想到的,你可能会忘记的唯一一件事就是实际上告诉孩子窗口谁是它的主人是:
Window2 w = new Window2();
w.Owner = this; // "this" being the parent window
w.ShowDialog();
或者,更简洁:
new Window2 { Owner = this }.ShowDialog();
那么,Ray已经把这一点发挥得淋漓尽致。简单来说,他想说的是,你要设置你的控件的内容在你Loaded
事件,重置Height
& Width
(以及ActualHeight
& ActualWidth
)窗口的定位完成之后。
为了解决这个问题,你有两个选择:
- 将您的内容值设置代码构造,或
- 添加一个简单的方法,根据
Owner
重新计算你的Window
的位置,在您的Loaded
事件结束时调用此方法,如下所示:
...
private void CenterOwner()
{
if (Owner != null)
{
double top = Owner.Top + ((Owner.Height - this.ActualHeight)/2);
double left = Owner.Left + ((Owner.Width - this.ActualWidth)/2);
this.Top = top < 0 ? 0 : top;
this.Left = left < 0 ? 0 : left;
}
}
受约束的动态内容大多是直接呈现Gui,但有时是GUI调度。定时器和其他线程可以启动(MVVM)属性更改事件。可以肯定的是,渲染是在接近时间完成的,但没有保证,因为要放置WPF Dispacher队列的优先级。 所以,你不能说什么时候渲染完成,WPF也不能说处理的顺序 - 所以WPF现在不可能成为计算StartPosition的理想时间。
一个窍门就是等待WPF队列是空的。那么你确定WPF有时间处理你的代码。这意味着,您可以延迟窗口的ShowDialog调用。
因此,为了执行MVVM的动态内容更改或其他动态更改,需要给GUI-Main线程。 不要试图手动计算位置,这是非常复杂的,以支持多显示器。 试试这个代码打开窗口,它只打开窗口,当WPF完成所有操作。
win.Dispatcher.Invoke(new Action(() => win.ShowDialog()), DispatcherPriority.ApplicationIdle);
- 1. WPF窗口大小
- 2. XNA更改窗口大小不工作
- 3. 窗口调整大小不工作
- 4. GUI窗口大小C#WPF
- 5. 调整窗口大小(以屏幕中心)WPF
- 6. JavaScript cytoscape不能正常工作,直到调整窗口大小窗口
- 7. 航点不能正常工作,直到窗口调整大小
- 8. 窗口调整大小功能随机不工作
- 9. 与ExpandableListActivity窗口功能FEATURE_LEFT_ICON不工作
- 10. 不能始终最大化WPF窗口
- 11. VisualStateManager不会改变wpf窗口的窗口大小
- 12. jQuery调整大小功能只能在窗口上工作?
- 13. WPF DataGrid窗口调整大小不会调整大小DataGridColumns
- 14. WPF窗口最小宽度取决于工具栏的大小
- 15. WPF - 自定义窗口不工作
- 16. UserControl在一个窗口不工作WPF
- 17. WPF自定义窗口:不能“取消”与Win7 Aero捕捉最大化窗口
- 18. 窗口大小与样机不同
- 19. jQuery Columnizer插件只能在窗口大小上正常工作
- 20. 匹配网格和窗口大小WPF
- 21. 自动调整WPF窗口大小
- 22. 窗口大小调整不起作用
- 23. 使wpf子窗口和父窗口同步?即拖动,调整大小等?
- 24. 小工具位置和窗口大小
- 25. PyQt - 调整父级窗口小部件的子窗口大小
- 26. ggplot geom_point不同的大小与窗口大小
- 27. 子类WPF窗口
- 28. 分离jQuery不工作时重新窗口调整大小
- 29. 窗口调整大小控制器不工作
- 30. 实习生chromeOptions.args窗口大小看起来不工作
谢谢,我实际上在Show()后加载内容。愚蠢的错误,现在工作正常:) – immuner 2009-11-17 11:49:38