.NET WPF Remember window size between sessions

后端 未结 12 936
悲哀的现实
悲哀的现实 2020-11-30 20:33

Basically when user resizes my application\'s window I want application to be same size when application is re-opened again.

At first I though of handling SizeChange

12条回答
  •  难免孤独
    2020-11-30 20:34

    I wrote a quick class which does this. Here is how it's called:

        public MainWindow()
        {
            FormSizeSaver.RegisterForm(this, () => Settings.Default.MainWindowSettings,
                                       s =>
                                       {
                                           Settings.Default.MainWindowSettings = s;
                                           Settings.Default.Save();
                                       });
            InitializeComponent();
            ...
    

    And here is the code:

    public class FormSizeSaver
    {
        private readonly Window window;
        private readonly Func getSetting;
        private readonly Action saveSetting;
        private FormSizeSaver(Window window, Func getSetting, Action saveSetting)
        {
            this.window = window;
            this.getSetting = () => FormSizeSaverSettings.FromString(getSetting());
            this.saveSetting = s => saveSetting(s.ToString());
    
            window.Initialized += InitializedHandler;
            window.StateChanged += StateChangedHandler;
            window.SizeChanged += SizeChangedHandler;
            window.LocationChanged += LocationChangedHandler;
        }
    
        public static FormSizeSaver RegisterForm(Window window, Func getSetting, Action saveSetting)
        {
            return new FormSizeSaver(window, getSetting, saveSetting);
        }
    
    
        private void SizeChangedHandler(object sender, SizeChangedEventArgs e)
        {
            var s = getSetting();
            s.Height = e.NewSize.Height;
            s.Width = e.NewSize.Width;
            saveSetting(s);
        }
    
        private void StateChangedHandler(object sender, EventArgs e)
        {
            var s = getSetting();
            if (window.WindowState == WindowState.Maximized)
            {
                if (!s.Maximized)
                {
                    s.Maximized = true;
                    saveSetting(s);
                }
            }
            else if (window.WindowState == WindowState.Normal)
            {
                if (s.Maximized)
                {
                    s.Maximized = false;
                    saveSetting(s);
                }
            }
        }
    
        private void InitializedHandler(object sender, EventArgs e)
        {
            var s = getSetting();
            window.WindowState = s.Maximized ? WindowState.Maximized : WindowState.Normal;
    
            if (s.Height != 0 && s.Width != 0)
            {
                window.Height = s.Height;
                window.Width = s.Width;
                window.WindowStartupLocation = WindowStartupLocation.Manual;
                window.Left = s.XLoc;
                window.Top = s.YLoc;
            }
        }
    
        private void LocationChangedHandler(object sender, EventArgs e)
        {
            var s = getSetting();
            s.XLoc = window.Left;
            s.YLoc = window.Top;
            saveSetting(s);
        }
    }
    
    [Serializable]
    internal class FormSizeSaverSettings
    {
        public double Height, Width, YLoc, XLoc;
        public bool Maximized;
    
        public override string ToString()
        {
            using (var ms = new MemoryStream())
            {
                var bf = new BinaryFormatter();
                bf.Serialize(ms, this);
                ms.Position = 0;
                byte[] buffer = new byte[(int)ms.Length];
                ms.Read(buffer, 0, buffer.Length);
                return Convert.ToBase64String(buffer);
            }
        }
    
        internal static FormSizeSaverSettings FromString(string value)
        {
            try
            {
                using (var ms = new MemoryStream(Convert.FromBase64String(value)))
                {
                    var bf = new BinaryFormatter();
                    return (FormSizeSaverSettings) bf.Deserialize(ms);
                }
            }
            catch (Exception)
            {
                return new FormSizeSaverSettings();
            }
        }
    }
    

提交回复
热议问题