using System.Linq;
using System.Windows;
namespace ExtendedControls
{
static public class WindowExt
{
// NB : Best to call this function from the windows Loaded event or after showing the window
// (otherwise window is just positioned to fill the secondary monitor rather than being maximised).
public static void MaximizeToSecondaryMonitor(this Window window)
{
var secondaryScreen = System.Windows.Forms.Screen.AllScreens.Where(s => !s.Primary).FirstOrDefault();
if (secondaryScreen != null)
{
if (!window.IsLoaded)
window.WindowStartupLocation = WindowStartupLocation.Manual;
var workingArea = secondaryScreen.WorkingArea;
window.Left = workingArea.Left;
window.Top = workingArea.Top;
window.Width = workingArea.Width;
window.Height = workingArea.Height;
// If window isn't loaded then maxmizing will result in the window displaying on the primary monitor
if ( window.IsLoaded )
window.WindowState = WindowState.Maximized;
}
}
}
}
8条答案
按热度按时间gblwokeq1#
将窗口最大化到辅助监视器(如果有)的扩展方法。不假定辅助监视器是System.Windows.Forms.Screen.AllScreens[2];
sd2nnvve2#
对于WPF应用程序,请查看this post。最终它取决于WindowState何时设置为Maximized。如果您在XAML或窗口构造函数中设置它(即在加载窗口之前),它将始终在主显示器上最大化。另一方面,如果您在加载窗口时将WindowState设置为Maximized,它将在之前最大化的屏幕上最大化。
zkure5ic3#
我注意到一个建议在Loaded事件中设置位置的答案,但是当窗口首先正常显示然后最大化时,这会导致 Flink 。如果您订阅构造函数中的SourceInitialized事件并在其中设置位置,它将在辅助监视器上处理最大化而不 Flink -我在这里假设WPF
替换辅助监视器上的任何坐标
jtjikinw4#
参见this codeproject article.
这里的代码可以工作,但是默认为主监视器。要改变这一点,你需要将对GetSystemMetrics的调用替换为对GetMonitorInfo的调用。使用GetMonitorInfo,你可以获得合适的RECT传递给SetWindowPos。
GetMonitorInfo允许您获取任何显示器的RECT。
有一个MSDN Article on Position Apps in Multi-Monitor Setups可能有助于更好地解释事情。
0kjbasz65#
eivgtgni6#
您的问题不清楚您是否正在寻找一种方法将窗口移动到辅助监视器,然后进入全屏模式,或者您只是希望在窗口所在的任何监视器(可能是主监视器或辅助监视器)上支持全屏模式。
如果是后者,对于WPF窗口,虽然与全屏模式不完全相同,但您可以在最大化时删除边框,并在未最大化时恢复边框。无需检查显示器等。标题栏的显示由边框状态控制。
Pavel在当前问题中给出了基于表单的答案,Nir在this question中给出了答案。
mec1mxoz7#
@jay-evans的回答对我来说很有用,但是,我还需要添加WpfscreenHelperNuget包来获取屏幕信息,而不像@grantnz的回答那样依赖于旧的System.Windows.Forms名称空间。
还要注意的是,只设置尺寸(左,上,宽+高)让我在每一边都有一个小边框。只有在设置了WindowState。最大化是它,真实的的全屏效果达到。
由于我有不同DPI配置的显示器,我还不得不使用WpfWorkingArea而不是WorkingArea,因为坐标返回不正确。
为完整起见,在此发布,这是使用WPF与.NET 7.0,并确认与不同的DPI配置:
egmofgnx8#
在WPF中:将WindowState属性设置为Normal(而不是Maximixed)并创建Loaded事件。在该事件中编写以下代码: