2008-12-06 10 views
1

Я использую следующий код для сохранения и восстановления положения и размера окна при перезапуске.Дрифт при восстановлении местоположения и размера окна в WPF

Я наблюдаю восходящий дрейф 28 пикселей каждый раз, когда я выполняю этот код!

Я читаю неправильные значения или исправляю их неправильно? Где число 28 (размер хром?), Исходящее из (и как я буду учитывать его программно, а не фиксированный номер в коде)?

Вот мой код:

public partial class MainStudioWindowControl : RibbonWindow 
{ 
    public MainStudioWindowControl() 
    { 
     App.MainWindowOwner = this; 
     this.Loaded += new System.Windows.RoutedEventHandler(MainStudioWindowControl_Loaded); 
    } 

    void MainStudioWindowControl_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     System.Windows.Window mainWindow = System.Windows.Application.Current.MainWindow; 
     mainWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.Manual; 
     if (Studio.Properties.Settings.Default.Width > 0) 
     { 
      mainWindow.Left = Studio.Properties.Settings.Default.Left; 
      mainWindow.Top = Studio.Properties.Settings.Default.Top; 
      mainWindow.Width = Studio.Properties.Settings.Default.Width; 
      mainWindow.Height = Studio.Properties.Settings.Default.Height; 
     } 
     Debug.WriteLine(string.Format("Loading: Top = {0}", this.Top)); 
    } 

    protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
    { 
     base.OnClosing(e); 
     System.Windows.Window mainWindow = System.Windows.Application.Current.MainWindow; 
     Studio.Properties.Settings.Default.Left = mainWindow.Left; 
     Studio.Properties.Settings.Default.Top = mainWindow.Top; 
     Studio.Properties.Settings.Default.Width = mainWindow.Width; 
     Studio.Properties.Settings.Default.Height = mainWindow.Height; 
     Studio.Properties.Settings.Default.Save(); 
     Debug.WriteLine(string.Format("Saving: Settings.Top = {0}", Studio.Properties.Settings.Default.Top)); 
    } 
} 

ответ

3

Попробуйте это:

1) Выведите свой класс от обычного окна, а не RibbonWindow - если что фиксирует это, это вопрос RibbonWindow.

2) Используйте жестко заданные значения для установки измерений в обработчике Loaded - если это исправлено, проблема имеет какое-то отношение к настройкам.

С этими двумя изменениями он работал отлично для меня. Окно появилось там, где оно должно появляться каждый раз.

+0

Да, я бы поспорил, что RibbonWindow не учитывает строку заголовка Windows, когда вы устанавливаете свойство Top, но когда вы ее получаете. – 2008-12-06 16:46:17