功能

时间:2017-05-23 09:59:42

标签: c# winforms events

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

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

提到this question建议在屏幕上创建多个表单实例,它再次无法同步按钮的状态。

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

最后一点是我需要它至少使用3个显示器,那么事件需要像多播一样吗?

更新:所有表单都在同一个应用程序中。更多细节:我在其中一个显示器上有一个MainForm,显示大多数信息,并且需要所有显示器上的其他表单作为开关操作。交换机的状态将发送回MainForm并在所有SwitchForm上同步。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

的MainForm:

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;
    }
}

SwitchForm:

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再次感谢!