2017-05-23 4 views
0

私の主なプロジェクトの一環として、複数のディスプレイに簡単なオン/オフスイッチを表示する必要がありますが、スイッチのステータスを同期させなければなりません。すべての画面で機能が重複しているウィンドウ

this questionsを参照すると、「マスター」ウィンドウのスナップショットを撮ることによって、「スレーブ」画面にウィンドウを表示します。 「スレーブ」ウィンドウで操作することができないため、私にとってはオプションではありません。

this questionは、画面全体に複数のフォームインスタンスを作成することを提案していますが、ボタンのステータスを同期することはできません。

私が行う必要があるのは、オン/オフスイッチのステータスを同期させることだけですので、2番目の例が私の要件にさらに適用されるようです。私が正しいとすれば、インスタンス間でパラメータを渡す方法や、イベントを発生させてイベントリスナーを追加する方法はわかりません。

最後に、少なくとも3つのディスプレイで作業する必要があるので、イベントはマルチキャストのようにする必要がありますか?

更新:すべてのフォームは同じアプリケーション内にあります。詳細:ほとんどの情報を表示するディスプレイの1つにMainFormが1つあり、スイッチとして動作するようにすべてのディスプレイに他のフォームが必要です。スイッチの状態はMainFormに返信され、すべてSwitchFormで同期されます。

ありがとうございます!

+0

これらのフォームは同じアプリケーションの一部ですか? – Zalomon

+0

@Zalomonはい。詳細:大部分の情報を表示するディスプレイの1つに「MainForm」が1つあり、スイッチとして動作するようにすべてのディスプレイに他のフォームが必要です。 switchの状態は 'MainForm'に返され、全ての' SwitchForm'で同期されます。 –

答えて

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に行き、もう一度感謝します!

1

SwitchFormでイベントをインスタンス化してキャプチャするためのコントロールクラス(MainFormでも構いませんが、それに対して助言します)があります。特定のイベントを作成して、必要なすべての情報(すべてのコントロールの新しい値など)を渡し、新しい値を設定するためにSwitchFormおよびMainFormにパブリックメソッドを作成することができます。

+0

ありがとうございました。さらなる質問:1)なぜ反対? SwitchFormは、デザインパターンに反しない限り、MainFormによって作成されます。 2)イベントを登録する方法は、それらを発生させ、処理するか?あなたは例やリンクをお願いしますか?ありがとう! –

+1

1)MainFormを使用することについては助言したいと思います。そのロジックは外部クラスで処理する必要があります。大した問題ではありませんが、私のフォームは可能な限り愚かなものが大好きです。 2)https://stackoverflow.com/questions/977326/propagating-events-from-one-form-to-another-form-in-c-sharp – Zalomon

+0

ありがとうございました。非常に役に立ちます。今私は双方向のイベントハンドラを作る方法を見つける必要があります:) –

関連する問題