Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF,在多个窗口之间切换而无需处理_C#_Wpf_Visual Studio 2013 - Fatal编程技术网

C# WPF,在多个窗口之间切换而无需处理

C# WPF,在多个窗口之间切换而无需处理,c#,wpf,visual-studio-2013,C#,Wpf,Visual Studio 2013,我有3个窗口,我可以很好地在它们之间切换。我遇到的问题是windows在隐藏数据时没有保存数据。我想他们在某个地方有了倾向,但我不知道怎么办。我在两个窗口上有一个文本框来测试这个。当只有两个窗口时,它工作得很好,但是添加第三个窗口会造成这个问题。这是我的主窗口 public partial class MainWindow : Window { private AutoImport auto; private DTLegacy dleg; public MainWind

我有3个窗口,我可以很好地在它们之间切换。我遇到的问题是windows在隐藏数据时没有保存数据。我想他们在某个地方有了倾向,但我不知道怎么办。我在两个窗口上有一个文本框来测试这个。当只有两个窗口时,它工作得很好,但是添加第三个窗口会造成这个问题。这是我的主窗口

public partial class MainWindow : Window
{
    private AutoImport auto;
    private DTLegacy dleg;

    public MainWindow()
    {
        InitializeComponent();
    }

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

    public MainWindow(DTLegacy parent)
    {
        InitializeComponent();
        dleg = parent;
    }

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

    private void btnDTLegacy_Click(object sender, RoutedEventArgs e)
    {
        this.Hide();
        if (dleg == null) { dleg = new DTLegacy(); }
        dleg.Show();
    }
}
窗口1

public AutoImport()
{
    InitializeComponent();
}

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

public DTLegacy()
{
    InitializeComponent();
}

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

我想答案可能是创建某种类型的window类,但我不确定这会是什么样子。

为什么每次都要创建一个新的
MainWindow
实例?您当前正在隐藏它,因此请再次显示它,而不是创建新的。 假设它是应用程序的主窗口,并且
AutoImport
/
DTLegacy
是“子”窗口,一种解决方案是将
MainWindow
实例作为“子”窗口的参数传递,这样您就可以轻松调用
.Show()

private MainWindow parent;
public AutoImport(MainWindow parent)
{
    InitializeComponent();
    this.parent = parent;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    this.Hide();
    this.parent.Show();
}

有两个概念。在
wpf
(连同
mvvm
)中,最好是在窗口被释放时。只需在视图模型中保留恢复状态所需的所有属性:焦点、选择、输入/选择的值等。另一个概念是只创建一次窗口,然后再不处理它们(著名的
winforms
隐藏
技巧),它仍应在wpf中工作。在启动时创建windows实例,永远不要再创建实例(就像您所做的那样!),而是调用该实例
Hide()
/
Show()
方法。