【问题标题】:how WindowStartupLocation works with many windowsWindowStartupLocation 如何与许多窗口一起工作
【发布时间】:2016-02-15 16:34:09
【问题描述】:

我有很多窗口,每次打开新窗口时都希望位置与上一个窗口相同。

我在每个窗口都试过这个:

WindowStartupLocation="CenterOwner"

但它不起作用:窗口仍然在其他地方弹出。

我试图在我的一个窗口中设置所有者,但这仍然不起作用。我也尝试了this问题的解决方案,但仍然没有乐趣。

如何确保每次打开新窗口(关闭前一个窗口后)时,我都获得与前一个窗口相同的位置?

【问题讨论】:

  • 同一应用程序或任何应用程序的新窗口?我个人更喜欢CenterScreen
  • @i486 相同的应用程序,是的,但我需要它跟随前一个窗口,所以如果用户将窗口移动到右上角,新窗口也应该在右上角。
  • @i486 我的意思是它可以是任何窗口,而不是同一个应用程序
  • 如果您希望在特定位置打开窗口,那么您必须使用 WindowStartupLocation.Manual 并设置 Left 和 Top 属性。完全由您决定 Left 和 Top 需要是什么,“上一个窗口”太模糊了。如果它是先前打开的现有窗口,那么您需要对该窗口的引用。如果它是以前打开的窗口但现在关闭了,那么您需要一个变量。
  • 换句话说 - 您必须在每次移动窗口后保存新位置(例如在注册表/ HKCU中),然后在启动时恢复最后一个位置。

标签: c# wpf


【解决方案1】:

您可以在 XAML 中(在每个窗口文件中)设置您的窗口默认位置,例如:

<Window x:Class="TabControl.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    xmlns:local="clr-namespace:TabControl"
    Title="MainWindow"    Height="300"          
    Top="100"
    Left="100"

根据您的情况,您可以获取父窗口的属性并将其设置为代码后面的子窗口。(因为您想在父窗口的位置打开)

    {
        InitializeComponent();
        var activeWindow = System.Windows.Application.Current.Windows.OfType<Window>().FirstOrDefault(win=>win.IsActive);
        if(activeWindow != null)
        {
            this.Top = activeWindow.Top;
            this.Left = activeWindow.Left;
        }
    }

代替this.Parent,您可以替换父窗口对象。希望窗口大小不是您关心的问题。

【讨论】:

  • 所以我只是把顶部和左侧放在每个窗口中?我不需要使用WindowStartupLocation?我回家试试,谢谢
  • @Mirza 当您设置 left 或 Top 时,这意味着您正在自动使用 WindowStartupLocation=Manual。您还可以创建一个窗口打开服务来打开您的窗口,这样您就不必在每个窗口中编写此代码。(如果您的应用程序中的窗口是从通用类型窗口(您的自定义类型)派生的,它也会这样做)
  • 很抱歉回复晚了,父母是空的,因为我认为我必须先设置它?如何将以前的窗口设置为父窗口?
  • 这里的父级可以不同,我可以从 A 或 C 去 B。那我怎么能有这样的动态父级
  • @Mirza 请看我的你[过时的答案。您可以将该代码放在 Window.Activated 事件中。
猜你喜欢
  • 2011-05-20
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多