【问题标题】:WPF - Toggle Visibility of multiple windowsWPF - 切换多个窗口的可见性
【发布时间】:2012-08-14 17:53:01
【问题描述】:

我将首先解释我的 WPF 应用程序的 UI。

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

TLDR 我希望能够在多个窗口之间切换,这样一次只能看到一个窗口,我如何管理多个窗口之间的切换??

注意:我可以从主窗口显示第二个窗口,但是从第二个窗口显示主窗口呢....无法得到它....或者如果有人可以向我展示实现此功能的不同方法:其他比多个窗口

此外,这是 UI 的扩展,我想在此页面上以这种结晶的外观显示按钮:http://postimage.org/image/4yibiulsh/ 任何人都可以指导我进行正确的实施吗,我已经浏览过很多网站,也尝试过通过混合创建这些,但我只是不是 UI 人员....请在这方面提供帮助 提前致谢。

【问题讨论】:

  • 您可以在第二个窗口的构造函数中传递主窗口的实例。但我不明白,如果你回到主窗口,为什么不直接关闭第二个窗口?
  • 如果我关闭窗口,当用户再次单击按钮时,我不必加载所有元素和数据,隐藏它然后在主应用程序关闭时关闭它似乎更好想法……对吧??
  • 我不确定,即使不需要,您也会将所有数据都保存在内存中。使用 Jon 建议的面板会更好。
  • 我在重复我在下面写的内容:“我也考虑过使用面板(实际上是不同的网格),但窗口大小差异太大,窗口的位置也不同......一个是就像一个侧边栏,一个用于通知,一个用于屏幕中心的设置......通过一个窗口管理所有内容并不容易”......或者实际上会更容易,我在问你的意见...... ..

标签: wpf windows user-interface


【解决方案1】:

我将创建一个“窗口管理器”,它将订阅打开/关闭的更改。 在这种情况下,您不必重载 Window 类。 示例(为我工作)。

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 取消订阅的行

【讨论】:

  • 哇......这是一个非常好的例子......我会尝试一下,让你知道会发生什么......不过只有一个问题:如果我关闭任何辅助窗口,然后我调用所有其他窗口的关闭事件,然后从这里调用 application.shutdown ??还是应该以不同的方式处理??...但是感谢您提供的那段代码...
  • @Billy 取决于您的逻辑。一般来说,我会避免这种情况。但同样 - 这取决于你。
【解决方案2】:

您可以为此使用多种方法。

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

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

希望对你有帮助……

【讨论】:

  • 感谢您的参考,但如果我关闭第二个窗口(退出应用程序),请告诉我在这种情况下我将如何管理关闭应用程序?我想传播退出事件并关闭所有窗口....而且我也考虑过使用面板(实际上是不同的网格)但是窗口大小差异太大而且窗口的位置也不同....一个就像一个侧边栏,一个用于通知,一个用于屏幕中心的设置......通过一个窗口管理所有内容并不容易,对吧??
  • 还有关于那些 UI 按钮的任何信息......我喜欢那个界面并想得到它......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2011-09-10
  • 1970-01-01
  • 2013-07-12
  • 2011-12-15
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多