【问题标题】:sharing a class between two wpf windows在两个 wpf 窗口之间共享一个类
【发布时间】:2017-03-20 23:57:00
【问题描述】:

我想在至少两个 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>();
   }
}

如何在多个窗口之间共享此类的单个实例?

好的代码显示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();
        }
    }
}

【问题讨论】:

  • 没有足够的信息来真正说明,但可能是en.wikipedia.org/wiki/Singleton_pattern?
  • 请解释“共享单个实例”的含义。一个你认为会有什么好处的例子会有帮助。
  • 共享一个实例:意味着有一个类 x 并且两个窗口都会更新它,并且更新会显示在它访问的任何地方。在 c++ 中,一个模块可能定义类 x,而所有其他模块将访问类 *ref where ref=&x.

标签: c# wpf


【解决方案1】:

有几种选择,例如:

  1. 我猜一个窗口可以打开另一个窗口,因此您可以在打开第二个窗口之前将此对象的一个​​实例传递给它。
  2. 您可以将其存储在 Application.Properties 中

    Application.Current.Properties["Key"] = myobject;

  3. 大型应用程序的最佳选择是使用一些依赖容器(它有很多实现)并将共享对象存储在这样的容器中

  4. 我真的不喜欢单例模式,因为它实际上不是一种模式,但你也可以使用它。

【讨论】:

  • 强制只有 1 个可用实例和只创建和使用 1 个实例是有区别的。在后一种情况下,您的方法有效,但如果在应用程序生命周期中必须只创建一个实例,那么单例就是要走的路。实例可以作为参数传递或分配给应用程序资源。
【解决方案2】:
var dd = new dd_internals();
var window1 = new YourWindow(dd);
var window2 = new YourWindow(dd);

您对dd 所做的任何更改都将在所有窗口实例中可用。如果您需要处理诸如多线程之类的事情,或者在某些事情发生变化时让dd 调用某些事情,您需要将其添加到您的问题中。

您的编辑在语法上无效; C# 区分大小写,因此Datadata 是两个不同的标识符,其中一个未声明。我猜你想要类似的东西:

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;
    }
}

在您的实际项目中,请使用比“data”、“Window1”等更好的名称。这些名字没有任何意义。在一个简短的示例中,它们很有用,但它们很快就会使真正的程序变得难以理解。

【讨论】:

  • 我在这里遇到的问题 dd 仅在说 window1 构造函数中看到...要使其可用于 window1 的任何成员函数,您需要类似 local_dd=dd 并在 window1 中创建 local_dd 的东西。我可以这样做...但是在 windows1 退出时您必须将其复制 dd=local_dd...似乎很乱。
  • 你必须在窗口构造函数之外创建dd并传入。你不需要复制任何东西。请edit您的帖子显示您的代码,因为我不明白困难是什么。
【解决方案3】:

你可以让类单例

 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>();
    }

【讨论】:

    【解决方案4】:

    我认为您需要先将课程设为公开或内部,然后才能在任何地方分享。

    【讨论】:

    • 仅当您希望该类对其他程序集可见时才需要。
    • 同意。如果在同一个程序集中,那么它至少不应该是“内部的”。如图所示的 dd_internals 类默认为“私有”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多