我正在使用本机 WPF 和 MVVM 开发一个非常简单的应用程序。主“shell”视图使用我认为常见的基本模式,其中包含一个与活动视图模型进行数据绑定的 ContentControl,该视图模型通过数据模板注入视图。这是它的缩写版本:
<Window.DataContext>
<local:ShellViewModel/>
</Window.DataContext>
<Window.Resources>
<DataTemplate DataType="{x:Type local:DbConfigViewModel}">
<local:DbConfigView/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:AuthenticationViewModel}">
<local:AuthenticationView/>
</DataTemplate>
</Window.Resources>
<DockPanel>
<ContentControl Content="{Binding CurrentViewModel}"/>
</DockPanel>
该窗口设置为根据视图自动调整大小,并设置为居中启动。这对于初始视图效果很好。不过,有些视图要大得多,当它们处于活动状态时,就会成为 UI 问题。我需要做的是让应用程序在视图发生变化时重新居中。
到目前为止,我尝试的是对主窗口的 Left 和 Top 属性进行数据绑定,如下所示:
<Window (....)
Width="auto" Height="auto"
SizeToContent="WidthAndHeight"
WindowStartupLocation="CenterScreen"
Left="{Binding WindowLeft}"
Top="{Binding WindowTop}">
我的导航与主 Windows 视图模型中的一个方法相关联,因此在该方法中,在将新视图模型设置为“当前视图模型”属性后,然后调用此方法:
private void CenterWindow()
{
Rect workArea = System.Windows.SystemParameters.WorkArea;
WindowLeft = (workArea.Width - Application.Current.MainWindow.Width) / 2 + workArea.Left;
WindowTop = (workArea.Height - Application.Current.MainWindow.Height) / 2 + workArea.Top;
}
这看起来应该可行,但似乎发生的是 MainWindow.Width 和 Height 尚未调整,因此它基于前一个视图而不是我刚刚实例化的视图居中。
那么是否有一些事件或其他地方可以调用此代码,以便它在呈现新视图后发生?这是正确的方法吗?