使用可选参数初始化WPF窗口

时间:2014-10-07 22:25:14

标签: c# wpf

我有两个Windows。主窗口和自动导入。主要目标是在窗口之间切换,同时保持一个窗口处于活动状态而不关闭窗口。我想要一个人展示,而另一个是隐藏的。我可以通过在另一个窗口中使用一个窗口作为参数来完成此操作。我遇到的唯一问题是启动窗口是带参数的窗口。我猜这需要是可选的吗?我不确定你怎么用窗户做这件事。

当我的项目开始时,出现主窗口。代码是

public partial class MainWindow : Window
{
    private AutoImport auto;

    public MainWindow(AutoImport parent)
    {
        InitializeComponent();
        auto = parent;
    }

    public void btnAutoImport_Click(object sender, RoutedEventArgs e)
    {
        this.Hide();
        auto.Show();   
    }
}

如果我单击该按钮,主窗口应该隐藏,另一个窗口应该出现。代码是

public AutoImport()
{
    InitializeComponent();
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.Hide();
    MainWindow main = new MainWindow(this);
    main.Show();           
}

然后可以对AutoImport进行更改,当在此表单上单击按钮时,AutoImport将隐藏,并且会出现新的MainWindow。如果再次单击主窗口上的按钮,AutoImport将提供先前所做的更改。当我在表单上切换代码时,我没有遇到任何问题。

2 个答案:

答案 0 :(得分:2)

要做你想问的事,你可以在MainWindow上添加另一个构造函数:

public partial class MainWindow : Window
{
    private AutoImport auto;

    public MainWindow()
    {
        InitializeComponent();
    }

    public MainWindow(AutoImport parent)
    {
        InitializeComponent();
        auto = parent;
    }

    public void btnAutoImport_Click(object sender, RoutedEventArgs e)
    {
        this.Hide();
        if (auto == null) { auto = new AutoImport(); }
        auto.Show();   
    }
}

虽然我认为在AutoImport中保留MainWindow实例的副本可能更有意义,因为您只是隐藏它。因此,在创建MainWindow实例时,还要创建AutoImport设置MainWindow的实例作为AutoImport的属性/字段。然后,当您单击按钮时,窗口将被交换。这样你就不必每次都创建一个新的MainWindow。像这样:

public partial class MainWindow : Window
{
    private AutoImport auto;

    public MainWindow()
    {
        InitializeComponent();
    }

    public MainWindow_Loaded(object sender, EventArgs e)
    {
        auto = new AutoImport(this);
    }

    public void btnAutoImport_Click(object sender, RoutedEventArgs e)
    {
        this.Hide();
        auto.Show();   
    }
}

public class AutoImport
{
    private Window LinkedWindow { get; set; }
    public AutoImport(Window parent)
    {
        InitializeComponent();
        LinkedWindow = parent;
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.Hide();
        LinkedWindow.Show();           
    }
}

答案 1 :(得分:1)

就非默认构造函数而言......

除了默认构造函数之外,添加以下内容:

public MainWindow(AutoImport parent) : this()
{
    auto = parent;
}

: this()将确保默认构造函数运行,其中包含InitializeComponent(),这样您就不会复制代码。

关于你的设计方法的主题,如果你不去MVVM路线,这似乎是这种情况,我会创建一些窗口管理器类来处理内存中的窗口及其状态。通过对两个窗口进行双向控制来控制谁的显示以及谁隐藏,你将创建非常紧密的耦合,任何改变都将是很多工作。我说让第三方(另一个类)处理那种事情。为什么一个窗口应该知道另一个窗口的存在呢?如果经理正在处理所有工作或转发数据而另一位经理正在处理状态,那么窗口本身只需要关心他们的工作。想想他们的责任......他们应该知道什么以及他们应该做些什么......当然不是另一个窗口的状态(在我看来)。

请注意,我不知道您的应用程序的全部范围,因此,您的解决方案可能会在没有过度设计的情况下解决它。我有一个案例需要一个非常基本的设置,所以我只是为每个窗口添加了一个静态属性。我有这个属性在创建后保存窗口的实例(在构造函数中完成)。如果在我尝试检查属性时没有实例化实例,则由属性创建一个实例。基本上,单例实现。因此,每当需要另一个窗口访问某个窗口时,它所要做的就是调用SomeWindow.Instance.Show()并显示窗口。如果没有先前的实例,则会创建并显示一个实例。我允许该属性处理所有肮脏的工作,知道窗口是否已经在内存中。这也允许我访问他们的数据。非常hackish方式,但它非常适合这种简单的场景。

这是编程的精彩之处 - 问题可以通过无限的方式解决。