【问题标题】:In which window should I instantiate my object?我应该在哪个窗口中实例化我的对象?
【发布时间】:2019-12-19 08:25:45
【问题描述】:

我的 WPF 应用程序有多个窗口:

  • 主窗口
    • 子窗口1
    • 子窗口2

我通过...从 MainWindow 实例化子级

public partial class MainWindow : Window
{
    ChildWindow1 CW1;
    ChildWindow2 CW2;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void btnButton1_Click(object sender, RoutedEventArgs e)
    {
        CW1 = new ChildWindow1();
        CW1.Show();
        CW1.Owner = this;

        CW2 = new ChildWindow2();
        CW2.Show();
        CW2.Owner = this;
    }
}

太棒了!

但这就是我遇到麻烦的地方:我有一个需要实例化的非 UI 类。

public class MyClass
{
    public void DoSomething()
    {
        //Do something here
    }
}

该类的对象应该“存在”在 ChildWindow1 中,因为它在逻辑上属于它。所以,我像这样在 ChildWindow1 中实例化它:

public partial class ChildWindow1 : Window
    {
        public MyClass MyObject = new MyClass();

        public ChildWindow1()
        {
            InitializeComponent();
        }
    }

但最终到了 ChildWindow2 需要与 ChildWindow1 中的对象交互的地步:

  1. 调用 Childwindow1 中对象的“DoSomething()”方法。
  2. 订阅 ChildWindow1 中的对象引发的事件

我可以在主窗口中完成所有这些操作,因为它拥有孩子,但我希望孩子能够直接互动。

  • 允许 CW1 CW2 交互是否违反了设计原则?

  • 如果不通过调用方法或订阅事件,您还能如何让它们进行交互?

感谢这里的所有人提供这个很棒的学习资源!非常感谢!

【问题讨论】:

    标签: wpf window parent interaction


    【解决方案1】:

    使它成为 MyClass 的公共和静态实例,几乎可以从任何地方访问它,因为应该基于特定的 window 实例来访问它。 如果您想从任何窗口访问变量,请将其设为静态或基于该窗口的实例调用它,例如:

    public partial class ChildWindow1 : Window
    {
        public static MyClass MyObject = new MyClass();
    
        public ChildWindow1()
        {
            InitializeComponent();
        }
    }
    

    像这样访问CW1.MyObject

    【讨论】:

    • 非常感谢。声明 MyObject 静态确实有效。然而,访问是通过:ChildWindow1.MyObject.DoSomething(); 所以,class 名称 (ChildWindow1),而不是 object 名称 (CW1)。跨度>
    • 有没有办法在其他窗口访问非静态对象?
    • 尝试将其作为构造函数参数传递 public ChildWindow2(MyClass obj){}
    猜你喜欢
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多