imm*_*ner 10 wpf sizetocontent
如果我设置SizeToContent为WidthAndHeight,则WindowStartupLocation="CenterOwner"无法正常工作.而不是新窗口的中心位于其父所有者的中心,它看起来更像是子窗口的左上角位于父窗口的中心.如果我删除SizeToContent然后一切都好.怎么了?
好吧,雷已经把这个放得很好.简单来说,他想说的是,您在Loaded事件中设置控件的内容,在窗口定位完成后重置Height&Width(以及ActualHeight&ActualWidth).
要解决这个问题,您有两种选择:
Window根据Owner和你的最后调用这个方法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;
}
}
Run Code Online (Sandbox Code Playgroud)
当显示窗口时,对其进行测量,然后WindowStartupLocation使用测量过程计算的窗口ActualWidth和ActualHeight窗口进行处理.
您描述的行为告诉我,ActualWidth并且ActualHeight在Show()或ShowDialog()调用时被测量为零或相对较小,并且仅在稍后设置为非零值.
例如,如果窗口的内容是使用仅在Loaded事件上设置的DataContext构建的,则会发生这种情况.当Show()被调用时,窗口一直没有Loaded尚未所以没有数据.稍后当Loaded事件触发时,它会设置DataContext,窗口会更新其内容,但定位已经发生.
还有许多其他方案,例如使用Dispatcher.BeginInvoke调用填充的内容,或来自单独的线程,或延迟或异步的绑定.
基本上你需要寻找任何可能导致你的窗口内容比正常情况更小的东西Show(),然后修复它.
| 归档时间: |
|
| 查看次数: |
5147 次 |
| 最近记录: |