5

lblDateUser Control にControlがありますMainScreenDate別のプロジェクトにあるクラスのメソッドで変更したいと思いAoWLibraryます。AoWLibrary は最初のプロジェクトに依存しているため、参照できません。

lblDate を静的にしようとしましたが、コンパイラがエラーをスローし続け、Date がアクセスできないように見えるパブリック プロパティがあります。

    public Label LabelDate
    {
        get { return lblDate; }
        set { lblDate = value; }
    }

クラス Date では、lblDate の Text プロパティを変更するパブリック メソッド CalculateDate が必要です

    public static void CalculateDate()
    {
        GameDate = month.ToString() + "/" + displayDay.ToString() + "/" + year.ToString();

    // LabelDate.Text = GameDate;
    // This is essentially what I need to do
    }

また、同じプロジェクト内の他のコントロールで lblDate にアクセスすることさえできません。

4

3 に答える 3

1

したがって、一般的な考え方は、スコープ内にあるものを追跡する必要があるということです。やりたいことを実行する方法はたくさんありますが、それらのいずれも、まだ完全には理解していない方法でオブジェクトが適切に相互参照することに依存しています。心配する必要はありません。誰もがいつかはこの問題に取り組まなければなりません。

そのメンバーを静的にしようとしたときにコンパイラが不平を言った理由は、ラベル自体が静的ではないためです。MainScreen の単一のインスタンスに関連付けられているため、静的なコンテキストでは意味がありません。これは、定義上、特定の MainForm への固有の参照を持たないスコープです。

もちろん、Date クラスもまったく異なるコンテキストですが、その非静的メンバーは Date のインスタンスにアクセスできます。作成するまで、これら 2 つのコンテキスト間にパスはありません。静的ルートは実際には機能しますが (Singleton パターンを参照してください。クラスの最初で唯一のインスタンスを静的に格納し、他の場所から参照するという考えです)、おそらく適切な設計ではありません。これを行う他の方法は、MainScreen のインスタンスを (できればインターフェイスを介して) Date に渡すか、LabelDate 自体を渡すことです。これらはすべて、話すために一緒に必要な 2 つの部分を得ることができます。

ただし、ゲームの状態がどこに保存されているかを考えることをお勧めします。それはライブラリにありますか、それとも消費アセンブリにありますか? 前者の場合は、ライブラリ クラスに保存して操作する必要があるデータの完全な GUI レス モデルを作成し、その既製のデータのみをメイン アプリケーションでそのまま使用することを検討することをお勧めします。もう 1 つの方法は、モデルをメイン アプリケーションに置き、必要に応じてライブラリを呼び出すだけです。この場合、ライブラリに回答を求める (またはせいぜいライブラリ内のイベントをリッスンする) ことに固執し、ライブラリが独自にアプリケーションに戻ること (情報を取得または提供するかどうか) を期待しないようにする必要があります。

これを行う方法を理解することで、スコープ管理の問題がはるかに簡単に処理できることがわかるでしょう。ほんの少しの優れたアーキテクチャでも、大いに役立ちます。

しかし、これが少し圧倒されても、あまり強調しないでください。楽しみのためにこれをやっているように聞こえますが、これは学習するのに最適な方法です。このような問題に遭遇し、良いデザインかそうでないデザインかのどちらかになりますが、いずれにせよ重要なコンセプトと格闘しているので、より良い結果が得られます。

于 2013-05-10T04:57:44.747 に答える
0

GameDate メソッドが文字列を返すようにしてから、それをメイン プロジェクトから呼び出すことをお勧めします。これは、基本的にライブラリの目的です。例えば:

public static string CalculateDate()
{
    return month.ToString() + "/" + displayDay.ToString() + "/" + year.ToString();
}

//in your main project
LabelDate.Text = myLibrary.CalculateDate();

同じプロジェクト内の他のコントロールからアクセスするには、デリゲートを使用する必要があります。追加を実行するデリゲートを提供し、デリゲートを宣言して、CaculateDate. 例:

public delegate void dateSet(string);

public void setDate(string date)
{
    labelDate.Text = date;
}

次に、あなたのCaculateDate方法で:

labeldate.Invoke(new MainForm.dateSet(), GameDate);
于 2013-05-10T03:50:54.950 に答える
0

プロパティLabelDateはuserControl MainScreenのクラスからのものですが、userControlを開始していません.. MainScreenのどのインスタンスを変更する予定ですか?

やったほうがいい

this.controlMainScreen.LabelDate = GameDate;

あなたがコメントで言っていることを考えると、あなたが持っている

 FormMain.Designer.cs there is: this.controlMainScreen = new Adventurers_of_Wintercrest.UserControls.MainScreen();
于 2013-05-10T03:21:27.637 に答える