我的Windows 11系统有两个显示器:

  • 一台扩展系数为150%的4k显示器,
  • 一台比例系数为100%的全高清显示器(当然,这也需要与不同的系统设置配合使用)

我想在另一台显示器上显示一个新的WPF窗口--这意味着在我的主应用程序当前没有显示的显示器上.因此,如果我的主窗口在4k显示器上,那么我想在全高清显示器上显示新窗口.

新的窗口应该会显示我的网络摄像头的全屏视图.但是,由于DPI设置不同,因此很难以正确的位置和大小显示全屏窗口.

我的窗口XAML是直接的,如下所示

<Window
    x:Class="MyApp.Fullscreen"
    x:ClassModifier="internal"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="800"
    Height="600"
    AllowsTransparency="False"
    Background="Black"
    ResizeMode="NoResize"
    ShowInTaskbar="False"
    Topmost="True"
    WindowStyle="None">
    <Grid>
        <Image Name="WebCam" />
    </Grid>
</Window>

我是这样初始化它的

 var allSystemScreens = System.Windows.Forms.Screen.AllScreens;
 var otherScreen = DetermineOtherScreen(allSystemScreens);

 var window = new Fullscreen();
 window.WindowStartupLocation = WindowStartupLocation.Manual;

 window.Left = otherScreen.WorkingArea.Left;
 window.Top = otherScreen.WorkingArea.Top;
 window.Width = otherScreen.WorkingArea.Width;
 window.Height = otherScreen.WorkingArea.Height;

 window.Show();

但这并不管用.它没有在显示器上完全显示窗口,或者比显示器大得多,正在伸手到第二个显示器上.

我研究了WorkingArea中的值.但它从来都不管用.

My app is DPI per-monitor-aware.我试图应用scale factor that I read from the system,但无论我使用什么值-它从来没有正确的位置或大小.

如何正确地做好这件事?或者,有没有更容易或更好的方法来实现这一点?也许不用用WindowStartupLocation.Manual美元.

推荐答案

好的,与其使用WorkingArea属性,这可能不考虑DPIzoom ,我们可以使用监视器的Bounds属性来计算正确的位置和大小,在我的新建议中,我使用监视器的Bounds属性,它代表整个监视器区域,包括任何任务栏或其他系统元素,通过将Bounds值除以DPIzoom 系数,我可以确保为特定监视器的DPIzoom 计算正确的位置和大小!

此外,我已经添加了window.WindowState = WindowState.Maximized;来将窗口设置为全屏模式.

var otherScreen = DetermineOtherScreen(allSystemScreens);

var otherScreenScaleFactor = VisualTreeHelper.GetDpi(window);
double otherScreenScale = otherScreenScaleFactor.DpiScaleX;

double left = otherScreen.Bounds.Left / otherScreenScale;
double top = otherScreen.Bounds.Top / otherScreenScale;
double width = otherScreen.Bounds.Width / otherScreenScale;
double height = otherScreen.Bounds.Height / otherScreenScale;
    
window.Left = left;
window.Top = top;
window.Width = width;
window.Height = height;

window.WindowState = WindowState.Maximized;

Csharp相关问答推荐

从WinUI 3中的网络摄像头捕获的旋转图像

如何从Date中剥离Timezone部分以仅保留本地Date部分?(no字符串解析或操作)

我如何才能获得被嘲笑班级的私有成员?

C# Json重新初始化动态类型

有没有一种方法可以在包含混合文本的标签中嵌入超链接?

Blazor服务器端的身份验证角色

自动映射程序在GroupBy之后使用项目

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

WinForms在Linux上的JetBrains Rider中的应用

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

当索引和外键是不同的数据类型时,如何设置导航属性?

如何在用户在线时限制令牌生成?

.NET 8 DI GetServices<;对象&>不工作

如何允许数组接受多个类型?

C#LINQ延迟执行和嵌套方法

我应该为C#12中的主构造函数参数创建私有属性吗?

如何设置WinForms按钮焦点,使其看起来像是被Tab键插入其中?

仅在ASP.NETCore应用程序中的附加单独端口上公开一组终结点

Xamarin.Forms中具有类似AspectFill的图像zoom 的水平滚动视图

在C#中删除多个不同名称的会话