1

私は一種の奇妙な状況を持っています...

私は WPF 魔女にユーザー コントロールを持っており、それに他のユーザー コントロールがいくつかアタッチされています。次に、ユーザー コントロールの UI 要素とメソッドにアクセスする必要がある大きなアルゴリズムを含む巨大な C# コード ファイルがあります。このホール プロセスはタイマーで動作します。ユーザーコントロールからC#コードファイルアルゴリズムにデータを送信し、コントロールからUI要素を返して更新し、そのメソッドにアクセスする必要があります...

ここで重要なことは、この巨大なアルゴリズムをコントロールのコード ビハインド ファイルに配置したくないということです。代わりに、コントロールの UI 要素とそのコード ファイルから宣言されたメソッドにアクセスしたいと考えています。

これまでに試したことは、使用しているユーザー コントロールからコード ファイルのクラスを実際に派生させることです。これはうまく動作しますが、派生クラスにアクセスするには、その新しいオブジェクトを作成する必要があり、表示される UI が取得されません。私が信じている新しい基本クラスオブジェクトも作成するため、更新されました...

だから私は次のようなものを持っています:

public partial class usrctrlSimulator : UserControl
{
    public usrctrlSimulator()
    {
        this.InitializeComponent();          
    }

    public void StartSimulator()
    {
        Algorithm = new csAlgorithm();

        Algorithm.InitializeSimulator();

        timer1.Start();
    }
}

public class csAlgorithm : usrctrlSimulator
{
    public csAlgorithm()
    {
    }

    public void InitializeSimulator()
    {
         txtblkSimulatorStatus.Text = "Started"; // this element would be from the user control
    }
}

したがって、私の質問は次のとおりです。新しいオブジェクトをインスタンス化せずに派生クラスを呼び出すにはどうすればよいですか。これにより、新しいユーザー コントロール オブジェクトが作成され、表示される UI が更新されないためです...または派生しない場合Algorithm クラス、ユーザー コントロールの要素とメソッドにアクセスするにはどのような可能性がありますか?

4

1 に答える 1

0

コントロールの 1 つのインスタンスに固執し、派生クラスの機能に引き続きアクセスしたい場合は、派生クラスをコントロールとして使用する必要があります。したがって、 のインスタンスの代わりに、usrctrlSimulatorどこでも csAlgorithm を使用します。

ただし、この設計がシナリオで最適なアプローチであるかどうかはわかりません。アルゴリズムは実際にはユーザー コントロールではないため、派生usrctrlSimulatorは理想的なオプションではない可能性があります。例:UserControlと呼ばれるメソッドがありApplyTemplate()ます。これはどういう意味csAlgorithmですか? 別の角度から見ることもできます: を呼び出すときなど、csAlgorithm使用できる場所ならどこでも を使用するのが合理的でしょうか?UserControlUserControl.AddLogicalChild(csAlgorithm)

usrctrlSimulator別のオプションは、 (composite)のメンバー変数としてアルゴリズムをインスタンス化することです。その場合でも、内部で使用することはできますがusrctrlSimulator、一方では UserControl であり、他方ではアルゴリズムの実装であるという 2 つの概念を明確に分離することになります。さらに、それらのいずれかを変更して、他方への影響を制限することもできます。

その場合、コードは次のようになります。

public partial class usrctrlSimulator : UserControl
{
   public usrctrlSimulator()
   {
      this.InitializeComponent();          
   }

   public void StartSimulator()
   {
      _algorithm= new csAlgorithm();
      _algorithm.InitializeSimulator();
      timer1.Start();
   }

   private csAlgorithm _algorithm;
}

public class csAlgorithm // not a UserControl anymore
{
   public csAlgorithm()
      {
      }

   public void InitializeSimulator()
   {
      txtblkSimulatorStatus.Text = "Started"; // this element would be from the user control
   }
}
于 2010-08-03T01:50:04.597 に答える