在两个wpf窗口之间共享一个类
本文关键字:共享 一个 之间 wpf 两个 窗口 | 更新日期: 2023-09-27 18:27:56
我想在至少两个wpf窗口之间共享以下类:
namespace WPF
{
class dd_internals
{
public int current_process_index;
public class process_class
{
public string process_name;
public List<string> parm_list;
public List<string> var_list;
public List<string> statements;
}
public List<process_class> process_list = new List<process_class>();
}
}
如何在多个窗口之间共享此类的单个实例?
Ok代码,显示dd_internals
被传递到window1
的构造函数中,但不能直接在window1
的成员函数中使用。
namespace posting2
{
public partial class Window1 : Window
{
public void Member()
{
int y = Data.current_process_index;
// Error: the name 'Data' does not exist in the current context
}
public Window1(dd_internals data)
{
int x = data.current_process_index;
// ok, it works here.
InitializeComponent();
}
}
}
有几个选项,例如:
- 正如我所猜测的,一个窗口可以打开另一个窗口,所以你可以在打开它之前将这个对象的实例传递给第二个窗口
-
您可以将其存储在Application.Properties 中
Application.Current.Properties["Key"]=myobject;
-
对于更大的应用程序,最好的选择是使用一些依赖容器(有很多实现),并将共享对象存储在这样的容器中
- 我真的不喜欢singleton模式,因为它实际上不是一个模式,但你也可以使用它
var dd = new dd_internals();
var window1 = new YourWindow(dd);
var window2 = new YourWindow(dd);
对dd
所做的任何更改都将在所有窗口实例中可用。如果您需要处理诸如多线程之类的事情,或者让dd
在某个东西发生更改时调用某个东西,那么您需要将其添加到您的问题中。
您的编辑在语法上无效;C#区分大小写,因此Data
和data
是两个不同的标识符,其中一个未声明。我猜你想要这样的东西:
public partial class Window1 : Window
{
private readonly dd_internals myDd;
public void Member()
{
int y = myDd.current_process_index;
}
public Window1(dd_internals data)
{
InitializeComponent();
myDd = data;
}
}
在你的真实项目中,请使用比"数据"、"Window1"等更好的名称。这些名称没有任何意义;在一个简短的例子中,它们很有用,但很快就会让一个真正的程序变得不可理解。
您可以使类成为singleton
public class dd_internals
{
private static dd_internals instance;
public static dd_internals singleInstance;
private dd_internals() { }
public static dd_internals Instance
{
get
{
if (instance == null)
{
instance = new dd_internals();
}
return instance;
}
}
public int current_process_index;
public class process_class
{
public string process_name;
public List<string> parm_list;
public List<string> var_list;
public List<string> statements;
}
public List<process_class> process_list = new List<process_class>();
}
在任何地方共享该类之前,我认为您需要将其公开或内部化。