2012-08-14 83 views
0

我将首先解释我的WPF应用程序的UI。WPF - 切换多个窗口的可见性

我创建了一个窗口,其中包含许多对用户始终可见的按钮(让我们称之为主窗口),每个按钮将打开一个与任务相关的新窗口。我想要做的是每当点击一个按钮时,主窗口应该被隐藏(可见性:折叠),并且应该显示新窗口。第二个窗口还将包含一个按钮,它将隐藏第二个窗口并显示主窗口。 也将打开第二个窗口将有不同的尺寸根据与它相关联的命令,所以我将有不同的窗口为每个

TLDR我想要能够在多个窗口之间切换,以便只有一个窗口是一次可见,我如何管理多个窗口之间的切换?

注意:我可以从主窗口显示第二个窗口,但是从第二个窗口显示主窗口......不能得到它....或者任何人都可以向我展示另一种实现方法:而不是多个窗口

另外,这是对用户界面的扩展,我想显示在这个晶体化的按钮看起来像这个页面上:http://postimage.org/image/4yibiulsh/ 任何人都可以指导我正确实施,我已经通过许多网站,也试图通过混合创建这些,但我只是不是一个用户界面的人....请在这方面需要帮助 在此先感谢。

+0

您可以在第二个窗口的构造函数中传递mainwindow的实例。但是我不明白为什么你不回到主窗口就关闭第二个窗口? – Terry 2012-08-14 08:18:57

+0

如果我关闭窗口不会加载所有的元素和数据,当用户再次点击按钮时,隐藏它,然后在主应用程序关闭时关闭它似乎是一个更好的主意......对吗? – Billy 2012-08-14 09:01:48

+0

我不确定,即使不需要,您也将拥有内存中的所有数据。使用像Jon这样的面板会更好。 – Terry 2012-08-14 09:03:47

回答

0

我想创建一个“窗口管理器”,这将认购开启/关闭的变化。 在这种情况下,您不必重载窗口类。 示例(为我工作)。

public class WindowsManager 
{ 
    static readonly List<Window> Windows=new List<Window>(); 

    public static T CreateWindow<T>(T window) where T:Window 
    { 
     Windows.Add(window); 
     window.Closed += WindowClosed; 
     window.IsVisibleChanged += WindowIsVisibleChanged; 
     return window; 
    } 

    static void WindowIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var mainWindow = Application.Current.Windows.OfType<MainWindow>().Single(); 
     mainWindow.Visibility = Equals(e.NewValue, true) ? Visibility.Hidden : Visibility.Visible; 
    } 

    static void WindowClosed(object sender, System.EventArgs e) 
    { 
     var window = (Window) sender; 
     window.Closed -= WindowClosed; 
     window.IsVisibleChanged -= WindowIsVisibleChanged; 
     Windows.Remove(window); 
    } 
} 

如何使用:

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     WindowsManager.CreateWindow(new Child1()).Show(); 
    } 

    private void button2_Click(object sender, RoutedEventArgs e) 
    { 
     WindowsManager.CreateWindow(new Child2()).Show(); 
    } 

所以,当孩子窗口将关闭,WindowsManager将会收到相关通知,将在主窗口

UPD1更新的知名度。 添加要取消订阅的行VisibleChanged

+0

哇....这是一个非常好的例子.....我要去尝试,让你知道会发生什么....只是一个问题,但是:这是正确的,如果我关闭任何辅助窗口,然后我调用所有其他窗口的关闭事件,然后从这里application.shutdown?或者应该以不同的方式处理??但是,谢谢你的代码片段...... – Billy 2012-08-14 09:30:04

+0

@Billy取决于你的逻辑。通常我会避免这种情况。但是,这又取决于你。 – Artiom 2012-08-14 09:47:03

0

你可以使用几种方法。

要轻松切换回主窗口:将MainWindow的引用添加到您的SecondWindow(或任何其他想要显示的窗口),并在该窗口的关闭事件中将MainWindow的可见性设置为可见。

您是否还考虑过将所有内容都保存在同一个窗口中,但是设置了可见和不可见的不同面板?这可能有同样的效果,但它是那么复杂......

希望帮助...

+0

谢谢你的引用位,但告诉我,如果我关闭第二个窗口(退出应用程序),那么我将如何管理关闭应用程序?我想传播退出事件并关闭所有窗口....并且我还考虑过使用面板(实际上是不同的网格),但窗口大小相差太大,而且窗口的位置也不同......一个就像边栏,一个用于通知,一个用于屏幕中心的设置....它不会很容易地通过一个窗口来管理所有,对吧? – Billy 2012-08-14 09:00:32

+0

也关于那些UI按钮的任何事情....我喜欢那个界面,并想要得到它..... – Billy 2012-08-14 09:03:05