Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF MVVM如何在视图更改后重新集中应用程序窗口?_Wpf_Mvvm_Centering - Fatal编程技术网

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

WPF MVVM如何在视图更改后重新集中应用程序窗口?,wpf,mvvm,centering,Wpf,Mvvm,Centering,我正在使用本机WPF和MVVM开发一个非常简单的应用程序。主“shell”视图使用了我认为是通用的基本模式,其中包含一个ContentControl,该ContentControl与活动viewmodel进行数据绑定,活动viewmodel通过数据模板注入视图。这是其外观的缩写版本: <Window.DataContext> <local:ShellViewModel/> </Window.DataContext> <Window.Resour

我正在使用本机WPF和MVVM开发一个非常简单的应用程序。主“shell”视图使用了我认为是通用的基本模式,其中包含一个ContentControl,该ContentControl与活动viewmodel进行数据绑定,活动viewmodel通过数据模板注入视图。这是其外观的缩写版本:

<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>
这看起来应该是可行的,但似乎正在发生的是主窗口。宽度和高度尚未调整,因此它是基于前面的视图居中,而不是我刚才实例化的视图


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

您需要在窗口中订阅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;
}

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

如果确定用户无法调整窗口大小,我想您应该可以通过为主窗口创建OnSizeChanged覆盖并在那里调用CenterWindow来实现这一点?注意:MSDN将工作区的大小描述为主要显示器上的工作区大小。因此,您的方法在多个监控系统上并不总是能达到您预期的效果。我曾考虑过OnSizeChanged事件,但我不想干扰客户端调整窗口大小的能力。作为最后的手段,我们会考虑删除该功能,但如果可能的话,我想找到另一种方法。谢谢你给我关于工作区的提示,我不知道。你能给我看一下有这种行为的专业应用程序吗?我猜你不能,那是因为这是个坏主意。调整应用程序
窗口
(除非它是子
窗口
)的大小不应该是开发团队关心的问题。制作一个流畅的UI,它尽可能适合所有视图,并将
窗口的大小留给用户决定。。。这是命中注定的。我想说,你问这个问题的事实表明,你的UI设计有问题。@Sheridan虽然我通常同意你的看法,但这个特殊的应用程序是我为我们的工程服务团队开发的一个非常简单的实用程序。应用程序的核心是一个单一的视图,但是我需要它们在到达那里之前经过两个简短的对话框。与使用传统的对话服务不同,我认为只需交换视图就足够简单了,如我所示。这是一个快速而简单的完成任务的方法,但我只需要解决这个细微的差别。这是我无法理解的一点。。。流体WPF UI将适合包含
窗口提供的任何空间。。。这似乎是你真正缺少的,你应该如何修复这个细微的差别,就像你所说的。如果窗口不在主屏幕上怎么办?
    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;
    }
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;
}