我有两个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将提供先前所做的更改。当我在表单上切换代码时,我没有遇到任何问题。
答案 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方式,但它非常适合这种简单的场景。
这是编程的精彩之处 - 问题可以通过无限的方式解决。