1

タイトルは私の質問です。以下に説明します。

私はvs2010であるwpfアプリケーションに取り組んでいます。2 つのウィンドウがあります。1 つは MainWindow で、もう 1 つは fileList ウィンドウです。私の fileList ウィンドウには、クリックするとファイルが読み込まれるファイルのリストがあります。onClick メソッドは fileList クラスに実装されています。ファイルをロードする関数は MainWindow 部分クラスに実装されています。

ウィンドウを表示するために MainWindow クラスでインスタンス化された私の fileList クラス。MainWidow を再度インスタンス化することはできません。MainWindow の関数 (メソッド) は、静的に宣言できない (方法がわからない) 他のパラメーターを使用しているため、静的に宣言できません。

以下に関連するコードを貼り付けます。親切に助けてください。

namespace test
{
  public partial class MainWindow : Window
     fileList fl = new fileList;

     public MainWindow()
     {
      InitializeComponent();
      fl.show();
      }

      public void porcessfile(string path)
      {
       //this method processes the the file at "path". It uses combobox and scrollviewer 
       //declared in xaml. I dont know how to declare static in xaml, else I will declare       
       //them static and change the whole method to static, so I can call it without  
       //instantiating. I tried making a nested-class, but then I can't  access variable 
       //declared in MainWindow (parent) class. Or there is a way to do that?

      }
}

そして他のクラス:

namespace test
{
  public partial class fileList : Window
  {
     public fileList()
     {
        IntializeComponent();
     }



     private void Button_click(object sender, RoutedEventsArgs e)
     {
      //code that gets "path" on click, works fine.

      processfile(string path); // what and how to do here.
     }
  }

} 

私がはっきりしていることを心から願っています。必要に応じて詳細をお尋ねください。

4

5 に答える 5

4

最も簡単な解決策は、Filelist ウィンドウに、Mainwindows の processfile メソッドを指すデリゲートを受け入れるコンストラクターを与えることです。この記事を見てください: http://www.codeproject.com/Articles/109000/C-Delegates-Step-by-Step

静的にすることは解決策ではありません-それは非常に醜いハックであり、デリゲートよりも多くの問題を引き起こします。

于 2013-07-04T08:47:45.627 に答える
1

わかりました、これはかなり簡単なはずです。ファイル パスを送信する Button_click メソッドで発生する FileList クラスでイベントを宣言し、MainWindow からサブスクライブして、受け取った引数で processfile メソッドを呼び出すだけです。

FileList クラスで:

    public event EventHandler<EventArgs<string>> PathReceived = delegate { };

これを Button_click で公開します。

cosntructor の MainWindow クラスで:

   this.fileList.PathReceived = (o,args) => this.ProcessFile(args.Value);

コードを公開:

   this.PathReceived(null, new EventArgs<string>(yourPath));

編集: EventArgs クラスを提供するのを忘れていました (これは私の古いプロジェクトからのものです)。

public class EventArgs<T> : EventArgs
{
    /// <summary>
    /// Initializes a new instance of the <see cref="EventArgs{T}"/> class.
    /// </summary>
    /// <param name="value">The value.</param>
    public EventArgs(T value)
    {
        Value = value;
    }

    /// <summary>
    /// Gets the value.
    /// </summary>
    /// <value>
    /// The value.
    /// </value>
    public T Value { get; private set; }
}
于 2013-07-04T09:10:56.970 に答える
0

これは、変数のセットアップ全体を行わずに、クラスの 1 つの中で実行するメソッドを取得するために行います。

string res = (new myClass ()).methodInsideMyclass ();
于 2014-05-23T11:01:47.567 に答える
0

これはアンチパターンのようなものですが (グローバル変数に似ていて、状態を永続化するため、テストがより困難になるため)、ここではシングルトン パターンを使用できます。

public partial class MainWindow {
  private static MainWindow instance = new MainWindow();

  public static MainWindow Instance { get { return instance; } }

  private FileList fl = new fileList();

  private MainWindow() {
    InitializeComponent();
    fl.show();
  }
}

その後、ファイル リストで を使用できますMainWindow.Instance

ただし、これには、2 つのクラス間の依存関係が部分的に隠されるという副作用があります。本当にやりたいことはMainWindow、コンストラクターでインスタンスを要求することfileListです。これにより、依存関係が明確になり、フレームワークを使用するための扉が開かれます (テスト容易性に役立ちます)。

また、C# の規則では、クラスを呼び出すのではFileListなく、クラスを呼び出しますfileList

于 2013-07-04T09:18:43.937 に答える