【问题标题】:Duplicate windows in all screens with function在所有具有功能的屏幕中复制窗口
【发布时间】:2017-05-23 09:59:42
【问题描述】:

作为我主要项目的一部分,我需要在多个显示器上显示一个简单的开/关开关,而开关的状态必须同步,我可以单击其中一个进行切换。

参考this questions,它通过拍摄“主”窗口的快照在“从”屏幕上显示窗口。这不是我的选择,因为我无法在“从属”窗口上操作。

参考this question建议跨屏创建多个表单实例,再次无法同步按钮状态。

似乎第二个示例更适合我的要求,因为我唯一需要做的就是同步开/关开关的状态。但是,如果我是正确的,我不知道如何在实例之间传递参数或如何引发事件并添加事件侦听器?

最后一点是,我需要它与至少 3 台显示器一起使用,所以该事件是否需要像多播一样?

更新:所有表格都在同一个应用程序中。更多详细信息:我在其中一个显示大部分信息的显示器上有一个MainForm,并且需要在所有显示器上使用其他表单来作为开关操作。开关状态将被发送回MainForm并同步到所有SwitchForm

谢谢!

【问题讨论】:

  • 这些表单是同一个应用程序的一部分吗?
  • @Zalomon 是的。更多详细信息:我在其中一个显示大部分信息的显示器上有一个MainForm,并且需要所有显示器上的其他表单作为开关操作。开关状态将被发送回MainForm,并在所有SwitchForms上同步。

标签: c# winforms events


【解决方案1】:

我将有一个控制类(可能是 MainForm,但我建议不要这样做)来实例化和捕获 SwitchForm 上的事件;您可以创建特定事件来传递您需要的所有信息(例如每个控件的新值),并在 SwitchForm 和 MainForm 上创建公共方法来设置新值。

【讨论】:

  • 非常感谢。进一步的问题:1)为什么反对? SwitchForm 无论如何都会由 MainForm 创建,如果它不违反设计模式的话。 2)如何注册事件,引发和处理它们?你能举个例子或一些链接吗?谢谢!
  • 1) 我建议不要使用 MainForm,因为该逻辑应该由外部类处理,这没什么大不了的,但根据经验,我喜欢我的表单尽可能愚蠢。 2)stackoverflow.com/questions/977326/…
  • 谢谢。这很有帮助。现在我需要找到一种方法来制作双向事件处理程序:)
【解决方案2】:

感谢@Zalomon 的建议。我终于找到了解决办法:

主窗体:

public partial class FormMain : Form {
    public FormMain() {
        InitializeComponent();
    }

    private void SwitchEventHandler(object sender, FormSwitch.SwitchEventArgs e) {
        Debug.Print($"Event {((Form)sender).Bounds}");
    }

    private void button1_Click(object sender, EventArgs e) {
        FormSwitch sw = new FormSwitch("1");
        sw.Show();
        FormSwitch sw2 = new FormSwitch("2");
        sw2.Show();
        sw.SwitchEvent += SwitchEventHandler;
        sw.SwitchEvent += sw.SwitchEventHandler;
        sw.SwitchEvent += sw2.SwitchEventHandler;
        sw2.SwitchEvent += SwitchEventHandler;
        sw2.SwitchEvent += sw.SwitchEventHandler;
        sw2.SwitchEvent += sw2.SwitchEventHandler;
    }
}

切换表单:

public partial class FormSwitch : Form {

    public class SwitchEventArgs : EventArgs {
        public bool Status { get; set; }
        public SwitchEventArgs(bool status) { Status = status; }
    }

    public event EventHandler<SwitchEventArgs> SwitchEvent;

    private bool _status;
    private string _name;

    public FormSwitch(string name) {
        _name = name;
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) {
        SwitchEvent(this, new SwitchEventArgs(!_status));
    }

    public void SwitchEventHandler(object sender, SwitchEventArgs e) {
        _status = e.Status;
        Debug.Print($"{_name}: {Bounds} {((Form)sender).Bounds} {_status}");
    }
}

请让我知道您的看法 - 它有效,但如果我做错了什么?

如果公众可以接受,我会接受我自己的答案。

感谢@Zalomon,再次感谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多