【问题标题】:Is there a better way to position a secondary window's startup location relative to the main window?有没有更好的方法来定位辅助窗口相对于主窗口的启动位置?
【发布时间】:2019-07-07 10:43:31
【问题描述】:

我正在尝试从位于我的主窗口上的菜单控件打开另一个窗口,并且我希望此窗口的启动位置相对于主窗口居中。我通过将辅助窗口的 Owner 属性设置为我的主窗口并将 XAML 中的 WindowStartupLocation 属性设置为 CenterOwner 来实现这一点,如下所示:

PopupWindow about = new PopupWindow();
about.Owner = Application.Current.MainWindow;
about.Show();
about.Owner = null;

这样做的问题是,具有所有者的窗口似乎总是位于所有者之上,并且每当最小化所有者窗口时,拥有的窗口也会最小化。为了解决这个问题,我在显示窗口后删除了所有者。代码看起来运行良好,但也有点像 hack。

我知道有一种方法可以将启动位置设置为手动,然后计算窗口的位置,但是我从弹出控件启动辅助窗口,但我找不到方法引用除主窗口以外的窗口。我想我可以遍历 Windows 集合并检查一个属性以查看它是否是我需要的窗口,但这似乎比我在这里所做的更糟糕。

有更好或更标准的方法吗?

【问题讨论】:

  • 您所描述的是一种简单的方法。您获取现有窗口的桌面坐标和大小,然后根据此信息计算新窗口的桌面坐标,同时还要考虑新窗口的初始大小。现有窗口可能是什么以及如何选择/识别/跟踪这种现有窗口/无论在很大程度上取决于您的应用程序逻辑/设计和使用场景,您的应用程序必须涵盖。没有一种黄金方法可以做到这一点,就像没有一种最好的给猫剥皮的方法一样。这一切都非常取决于

标签: c# wpf


【解决方案1】:

没有 “最佳” 方法本身可以做这种事情。它实际上没有任何内置功能。你可能会说,所有这样做的方法都是一种“黑客”。执行此操作的标准方法是获取主窗口的坐标,并根据 about 窗口计算您希望其位置在哪里。或者你也可以按照自己的方式去做。这是一个简单的例子:

int width = mainwindow.getWidth() / 2;
int height = mainWindow.getHeight() / 2;
int locationWidth = width - about.getWidth() / 2;
int locationHeight = height - about.getHeight() / 2;

// Then set it
about.Location = new Cursor(locationWidth, locationHeight);

我不记得具体如何设置位置,因为我不在我的普通电脑上。但你明白了。此外,我们使用 width - about.getWidth() / 2,因为在 C# 中,位置不是从中心设置的,而是从左上角设置的。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 2011-01-27
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2012-10-23
    • 2010-12-05
    相关资源
    最近更新 更多