首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF MVVM如何在视图更改后将应用程序窗口重新居中?

WPF MVVM如何在视图更改后将应用程序窗口重新居中?
EN

Stack Overflow用户
提问于 2014-02-24 22:40:13
回答 1查看 2.2K关注 0票数 1

我正在开发一个使用本地WPF和MVVM的非常简单的应用程序。主要的“外壳”视图使用我认为是常见的基本模式,其中包含一个绑定到活动视图模型的ContentControl,该视图通过数据模板注入视图。这是它看起来的缩写版本:

代码语言:javascript
复制
<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属性进行数据绑定,如下所示:

代码语言:javascript
复制
<Window (....)
    Width="auto" Height="auto"
    SizeToContent="WidthAndHeight"
    WindowStartupLocation="CenterScreen"
    Left="{Binding WindowLeft}"
    Top="{Binding WindowTop}">

我的导航被绑定到主窗口的视图模型中的一个方法,因此在该方法中,在新的视图模型被设置为CurrentViewModel属性之后,我将调用此方法:

代码语言:javascript
复制
    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还没有调整,所以它是基于先前的视图居中的,而不是我刚刚实例化的视图。

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

EN

Stack Overflow用户

发布于 2014-02-25 02:23:17

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

代码语言:javascript
复制
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;
}

如果您希望在viewModel中使用交互事件,则可以使用它

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21990866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档