【问题标题】:C# WPF fit application depending on monitor size after maximize/minimize after moving between monitorsC# WPF 适合应用程序,具体取决于在监视器之间移动后最大化/最小化后的监视器大小
【发布时间】:2018-08-16 14:22:35
【问题描述】:

我有两台显示器:

屏幕 1:这是 1920x1080 的辅助屏幕

屏幕 2:这是 1600x900 的主屏幕

屏幕 1 比屏幕 2 大。

当我在屏幕 2 中打开我的应用程序,然后将其从屏幕 2 移动到屏幕 1 并尝试最小化然后最大化我的应用程序时,最大尺寸由屏幕 2 占用,而不是当前显示器大小(它不会'不会显示为与显示器大小相关的最大化)

如何编辑我的代码,以便最大化和最小化以获取应用程序现在存在的屏幕分辨率,而不是根据主监视器获取它?

我正在使用此线程中的代码来调整大小: https://blogs.msdn.microsoft.com/llobo/2006/08/01/maximizing-window-with-windowstylenone-considering-taskbar/

与此回复相同: https://stackoverflow.com/a/6315427/5825468

谢谢

【问题讨论】:

  • 你能显示你用来调整大小的代码吗?
  • 嗨@JeffR。我在帖子中添加了代码,谢谢
  • 无需任何代码,只需使用 Windows 键加箭头快捷键即可。 Win+left 或 right 在多个显示器的特定位置上循环(试试看,你会看到)和 Win+up 最大化。
  • @Richardissimo 当我在最大化我的应用程序时删除该代码时,它会越过任务栏。我的应用程序是遗留项目,但我已经更新了它的 .NET 版本..

标签: c# wpf resolution screen-resolution


【解决方案1】:

要获取当前屏幕的大小,您可能必须使用 windows 窗体方法 FromHandle 之类的

using System.Windows;
using System.Windows.Forms;
using System.Windows.Interop;

namespace TestApp
{
    public partial class MainWindow : Window
    {           
        public Screen GetCurrentScreen(Window window)
        {
            return Screen.FromHandle(new WindowInteropHelper(window).Handle);
        }

        public MainWindow()
        {
            InitializeComponent();

            var screen = GetCurrentScreen(this);
            var height = screen.Bounds.Height;
            var width = screen.Bounds.Width;

            // ...
        }     
    }
}

另一种选择是订阅窗口的 LocationChanged 事件,以了解您的应用程序窗口何时已移动到辅助屏幕,请参阅 StepUp 的 this answer

【讨论】:

  • FromHandle 选项仅与获取应用程序所在屏幕的大小有关。我的问题是在将应用程序从一台显示器移动到另一台显示器并尝试最大化之后。只有当我们只有 2 台显示器时,第二个选项才有效
  • @Zakk 看看this CodeProject article(如果没有帮助,请查看thisthis
  • @Zakk 您是否通过链接的 CodeProject 文章找到了解决方案?
  • 非常感谢!!来自 codeProject 的项目有效。解决方案是添加 OnLocationChangedEvent 并在其中获取屏幕尺寸,就像在项目中一样。非常感谢您的帮助。
【解决方案2】:

先订阅状态改变事件:

public MainWindow()
{
   InitializeComponent();
   this.StateChanged += MainWindow_StateChanged;
}

然后只有在最小化之后,恢复虚拟/主屏幕尺寸如下: 由于我不知道您的默认应用程序大小是多少,如果它不是全屏,最后您可以通过 SystemParameters 屏幕大小轻松恢复它们,只需一点逻辑。

private void MainWindow_StateChanged(object sender, EventArgs e)
{
   if (this.WindowState != WindowState.Minimized)
   {
                        this.Width = SystemParameters.PrimaryScreenWidth;
                        this.Height = SystemParameters.PrimaryScreenHeight;
                        //this.Width = SystemParameters.VirtualScreenWidth;
                        //this.Height =SystemParameters.VirtualScreenHeight;
                        //this.Width = SystemParameters.WorkArea.Width                            
                        //this.Height =SystemParameters.WorkArea.Height;
                     }
   }

应该处理这种情况,SystemParameters 公开以下数据:

PrimeryScreenHeight/Width:

屏幕的高度/宽度。

VirtualScreenWidth/Height:

虚拟屏幕的宽度/高度。

WorkArea:

接收工作区坐标的 RECT 结构,表示为 作为虚拟屏幕坐标。

【讨论】:

  • 当我将应用程序移动到第二台显示器并尝试最大化它时,这个 SystemParameter 会给我正确的尺寸吗?(这是第二台显示器的尺寸)
  • 我刚刚编辑了我的答案,以便为您提供更多详细信息,因为我不确定什么是插件,其中一个应该可以解决问题,如果您可以调试您的代码和在此处发布信息。
  • Primary 和 Workarea 返回主屏幕尺寸。 VirtualScreen 返回所有屏幕组合的宽度和高度
  • 如果您只有 2 个显示器,那么您的长度将是虚拟的减去主要的。你应该试一试,看看它是否能解决你的最小化和最大化问题,直到用多屏解决方案编辑评论
  • 我必须创建适用于所有情况的解决方案,而不仅仅是 2 个显示器。我知道用 2 台显示器我可以制作 VirtualScreen - PrimaryScreen 来获得第二台..
猜你喜欢
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多