WPF MVVM如何在视图更改后重新设置应用程序窗口的中心



我正在使用本机WPF和MVVM开发一个非常简单的应用程序。主"shell"视图使用了我认为是常见的基本模式,其中它包含一个ContentControl,该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的视图模型中的一个方法,因此在该方法中,在将新的视图模型设置为CurrentViewModel属性后,我将调用此方法:

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。宽度和高度还没有调整,所以它是基于上一个视图而不是我刚刚实例化的视图居中的。

那么,是否有一些事件或其他地方可以调用此代码,以便在呈现新视图后发生?这是正确的方法吗?

您需要在窗口中订阅SizeChanged,然后:

private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (e.PreviousSize == e.NewSize)
return;
var w = SystemParameters.PrimaryScreenWidth;
var h = SystemParameters.PrimaryScreenHeight;
this.Left = (w - e.NewSize.Width) / 2;
this.Top = (h - e.NewSize.Height) / 2;
}

如果你想在视图中使用交互事件,你可以使用模型

最新更新