阅读 70

简单管理WPF所有弹出窗体

在贴吧上看到这么个需求,就是需要能够关闭最后一个处于激活状态的窗体

所以写了这么个小类

/// 
    /// 窗体管理
    /// 
    public class WindowManager
    {
        private static Lazy manager = new Lazy(() => new WindowManager());
        public static WindowManager Manager
        {
            get
            {
                return manager.Value;
            }
        }

        /// 
        /// 存储所有加入的激活窗体
        /// 
        private List lastWindows = new List();

        /// 
        /// 将窗体添加到管理中
        /// 
        /// 要添加的窗体
        public void AddActive(Window window)
        {
            //绑定窗体的激活事件
            window.Activated += Window_Activated;
            //绑定窗体的关闭事件
            window.Closing += Window_Closing;

            //如果添加的新窗体已加载,则添加到激活列表中
            if (window.IsLoaded)
                this.lastWindows.Add(window);
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            this.RemoveActive(sender);
        }

        private Window RemoveActive(object sender)
        {
            var window = sender as Window;

            //关闭,则从队列中移除
            if (this.lastWindows.Contains(window))
            {
                this.lastWindows.Remove(window);
            }
            return window;
        }

        private void Window_Activated(object sender, EventArgs e)
        {
            var window = this.RemoveActive(sender);
            this.lastWindows.Add(window);
        }

        /// 
        /// 关闭最后一个激活的窗体
        /// 
        public void CloseActive()
        {
            //获取最后一个,直接关闭
            var window = this.lastWindows.LastOrDefault();
            if (window != null)
            {
                window.Close();
            }
        }

        /// 
        /// 获取最后一个激活的窗体
        /// 
        /// 
        public Window GetLastActive()
        {
            return this.lastWindows.LastOrDefault();
        }

        /// 
        /// 关闭所有已激活的窗体
        /// 
        public void CloseAll()
        {
            for (int i = this.lastWindows.Count - 1; i > -1; i--)
            {
                this.lastWindows[i].Close();
            }
        }
    }

  

使用方式

Xaml

  
        

  后台事件

  private void Open_Click(object sender, RoutedEventArgs e)
        {
           var window= new Window1(Guid.NewGuid().ToString());
            WindowManager.Manager.AddActive(window);
            window.Show();
        }

        private void Get_Click(object sender, RoutedEventArgs e)
        {
            var window = WindowManager.Manager.GetLastActive();
            if (window != null)
                this.txt.Text += window.Title + " :Active" + Environment.NewLine;
        }

        private void Close_Click(object sender, RoutedEventArgs e)
        {
            WindowManager.Manager.CloseActive();
        }

        private void CloseAll_Click(object sender, RoutedEventArgs e)
        {
            WindowManager.Manager.CloseAll();
        }

  开启新窗体时,以其Title来标识不同的窗体

/// 
    /// Window1.xaml 的交互逻辑
    /// 
    public partial class Window1 : Window
    {
        public Window1(string title)
        {
            InitializeComponent();
            this.Title = title;
        }

    }

  最后效果gif

原文:https://www.cnblogs.com/rbzz/p/15189006.html

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐