1

标题是我的问题。我将在下面解释。

我正在研究wpf应用程序是vs2010。我有两个窗口,一个是我的 MainWindow,另一个是 fileList 窗口。在我的 fileList 窗口中,我有一个文件列表,单击时应该加载文件。onClick 方法在 fileList 类中实现。加载文件的功能在 MainWindow 部分类中实现。

我的 fileList 类在 MainWindow 类中实例化以显示窗口。我无法再次实例化 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

应用程序中的所有窗口都有一个静态便利访问属性:

应用程序.当前.Windows

然后简单地取第一个(或者如果你有多个,找出正确的一个)并转换为你的MainWindow类型。现在你有一个实例来调用你的方法。

于 2013-07-04T08:54:36.043 回答
1

好的,这应该相当容易。您只需要在 FileList 类中声明一个事件,该事件在您的 Button_click 方法中触发,发送文件路径并从 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

我这样做是为了让一种方法在我的一个类中运行,而无需进行整个变量设置。

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.

但是,这具有部分隐藏两个类之间的依赖关系的副作用。您真正想要做的是MainWindow在构造函数中需要一个实例来fileList. 这使依赖关系保持明显,并为使用框架打开了大门(这将帮助您提高可测试性)。

此外,C# 约定是调用类FileList而不是fileList.

于 2013-07-04T09:18:43.937 回答