【问题标题】:Minimize/Maximize both the screens最小化/最大化两个屏幕
【发布时间】:2011-10-27 09:23:03
【问题描述】:

我有一个在 2 台显示器上运行的应用程序(比如主屏幕和辅助屏幕)。辅助屏幕没有设置控制框属性。它完全取决于主屏幕的功能。我无法弄清楚的是,如果我将主屏幕最小化到系统任务栏,我也需要最小化辅助屏幕。同样,一旦我最大化主要,次要也应该最大化。

更新 我厌倦了做这样的事情,但把它搞砸了。它会在我不想要的应用程序启动后立即创建 2 个表单。

private void MainForm_Resize(object sender, EventArgs e)
{
     SecondaryLayoutForm secondaryLayoutForm = new SecondaryLayoutForm();
     if (this.WindowState == FormWindowState.Minimized)
     {
         secondaryLayoutForm.Hide();
     }
     else
     {
         secondaryLayoutForm.Show();
     }
}

谢谢

【问题讨论】:

  • 你有参考副屏的Form吗?如果是这样,您可以查看操作 WindowState 属性。 social.msdn.microsoft.com/forums/en-us/winforms/thread/…
  • 我确实有对辅助屏幕的引用,但在主屏幕表单中没有。仅当满足某些值时,辅助屏幕才会在另一个类中实例化。所以基本上我的主屏幕中没有秒屏幕的参考
  • 您可以在次要表单订阅的主要表单上创建最小化/最大化事件。
  • 这就是我想知道的:)。我试图在主要表单上创建一个 Resize 事件,但把它搞砸了。 private void MainForm_Resize(object sender, EventArgs e) { SecondaryLayoutForm secondaryLayoutForm = new SecondaryLayoutForm(); if (this.WindowState == FormWindowState.Minimized) { secondaryLayoutForm.Hide(); } else { secondaryLayoutForm.Show(); } }

标签: c# winforms multiple-monitors


【解决方案1】:

在你的 MainForm 类上试试这个:

private SecondaryLayoutForm secondaryLayoutForm;

private void MainForm_Resize(object sender, EventArgs e)
{
   if (this.secondaryLayoutForm == null)
   {
      this.secondaryLayoutForm = new SecondaryLayoutForm();
   }

   // replace the 'this.ShouldShowSecondaryForm()' call with whatever 
   // your special condition is for showing the secondary form.
   if (this.WindowState != FormWindowState.Minimized && this.ShouldShowSecondaryForm())
   {
        this.secondaryLayoutForm.Show();
   }
   else
   {
        this.secondaryLayoutForm.Hide();
   }
}

这使得 MainForm 负责创建您的 SecondaryLayoutForm 并控制其窗口状态 - 如果您不希望这样做,那么请考虑创建一个 UIManager 类或其他东西来分离它。

更新

我用 2 个表单编写的示例应用程序。这是 Form1 中的内容,Form2 上只有一个文本框,因此它与 Form1 明显不同。

public partial class Form1 : Form
{
    private Form2 f2;

    public Form1()
    {
        InitializeComponent();
        this.Resize += new System.EventHandler(Form1_Resize);

        // Initialize Form2 
        f2 = new Form2();
    }

    void Form1_Resize(object sender, System.EventArgs e)
    {
       // whenever I change the size of Form1, make sure 
       // Form2 has the same WindowState
       f2.WindowState = this.WindowState;
    }

    // This is your condition to either show or hide the form.
    //
    // Rather than a checkbox, have something that will respond to whatever 
    // condition you have set out - probably an event on another class.
    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox1.Checked)
        {
            f2.Show();
        }
        else
        {
            f2.Hide();
        }
    }
}

更新:如何从不同的班级执行此操作的示例

public partial class UIManager
{
    private Form2 f1;
    private Form2 f2;
    private bool shouldShowForm2 = false;

    public bool ShouldShowForm2 
    { 
       get { return shouldShowForm2; }
       set { shouldShowForm2 = value;  OnShouldShowForm2Changed(); }
    }

    public UIManager()
    {
        InitializeComponent();

        // Initialize Forms
        f1 = new Form1();
        f2 = new Form2();
        f1.Resize += new System.EventHandler(f1_Resize);
        f1.Show();
    }

    void f1_Resize(object sender, System.EventArgs e)
    {
       // whenever I change the size of Form1, make sure 
       // Form2 has the same WindowState
       f2.WindowState = f1.WindowState;
    }

    // This is your condition to either show or hide the form.
    private void OnShouldShowForm2Changed(object sender, EventArgs e)
    {
        if (ShouldShowForm2)
        {
            f2.Show();
        }
        else
        {
            f2.Hide();
        }
    }
}

但是,无论您是从其中一个表单还是从一个单独的类执行此操作,都需要引用这两个表单,以便同步窗口状态。

【讨论】:

  • 这与我所做的类似。我了解您在外面声明了 secondaryLayoutForm。但是当应用程序第一次加载时,secondaryLayoutForm 将始终为空。所以会打开一个我不想要的空白表格。
  • 好的,我创建了一个示例,它可以确保辅助窗口复制主窗口。您需要更改检查,并且如果您不希望辅助窗口由主窗口控制,则可能需要将此代码分开一些。
  • 谢谢,这绝对是解决问题的方法之一。但不幸的是,在我们的设计中,主窗体根本无法访问辅助窗体。它对用户完全隐藏。但我确信这绝对可以作为一个通用示例,所以我会接受这个解决方案。
  • 酷 :) 是的,这是一个通用示例。您是否有另一个类来管理是否应该显示/最小化 SecondaryForm 等并且引用这两种表单?如果是这样,您应该将 MainForm.Resize 事件处理程序移动到该类中。不过,这似乎是一个更重量级的例子。
  • 我有一个管理 MainForm 和另一个 LayoutGrid 类的应用程序管理器类。辅助表单存在于 LayoutGrid 类中,因为我想对用户隐藏这个类。它应该看起来像为某些项目弹出的 1 个窗口。所以我要做的是在 LayoutGrid 中,我必须访问应用程序管理器的表单并处理它,我现在已经完成了。但一直在寻找不同的方法。
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多