0

「DeviceManager」クラスとウィンドウフォーム「MainForm」の両方のインスタンスがフィールドとして保存されている「App」クラスがあります。MainForm は、システム トレイ アイコンをクリックすると表示されます。DeviceManager には Docked メソッドと Undocked メソッドがあり、Docked は同期操作を開始します。Docked メソッドは、MainForm が表示されていない場合にのみ操作を開始する必要があります。

DeviceManager は App のメンバーにアクセスできないため、App の MainForm への参照を使用してフォームのステータスを確認することはできません。App を DeviceManager のコンストラクターに渡すことは、DeviceManager がそのような参照を他に必要としない場合、多くの結合のように見えます (MainForm と DeviceManager はこれまでお互いを認識していません)。

現在、App.IsUserActive プロパティのセッターに、DeviceManager が独自の「IsUserActive」フィールドを維持するために使用できるイベントを発生させることを検討しています。

私が調べることができる他のアプローチはありますか?

編集:説明するためにコードを追加しました:

internal class App
{
    private DeviceManager _deviceMgr;
    private MainForm _mainForm;

    internal App()
    {
        _deviceMgr = new DeviceManager();
        _mainForm = new MainForm { Visible = false };
    }
}

internal class DeviceManager
{
    private void Docked()
    {
        if (!_mainForm.Visible) //can't see MainForm or App from here
        {
            Connect();
            StartSynchronization();  
        }
    }

    private void Undocked()
    {
        Disconnect();
    }
}
4

1 に答える 1

0

使用できるフォームへのグローバル リファレンスがあります。簡単な例を次に示します。

//Inside of DeviceManager class
private bool CheckFormVisibility<TForm>() where TForm : Form
{
    TForm form = System.Windows.Forms.Application.OpenForms.OfType<TForm>().SingleOrDefault();
    return form != null && form.Visible;
}

次に、ジェネリックを呼び出すCheckFormVisibility<MyForm>()か削除して、特にMyForm.

**ここでは、フォームのインスタンスがゼロまたは 1 つしかないと仮定しています。

于 2013-03-13T15:08:09.787 に答える