2014-12-18 2 views
0

Я пытаюсь сделать свое главное окно, чтобы запомнить и восстановить положение и размер при запуске. Поэтому я попытался связать местоположение запуска моего окна до свойств в моем ViewModel следующим образом:Binding WindowStartupLocation

<Window x:Class="MyApp.Views.MainWindow" 
    ... 
    Width="{Binding Width}" 
    Height="{Binding Height}" 
    WindowStartupLocation="{Binding WindowStartupLocation}" 
    WindowState="{Binding WindowState}" 
    MinHeight="600" 
    MinWidth="800" 
    Closing="OnWindowClosing" 
    Closed="OnWindowClosed" 
    ContentRendered="OnMainWindowReady" 
    ...> 

Мой ViewModel:

 ... 

     // Default settings 
     WindowState = (WindowState)FormWindowState.Normal; 
     this.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
     Width = 800; 
     Height = 600; 

     // check if the saved bounds are nonzero and is visible on any screen 
     if (Properties.Settings.Default.WindowStartupLocation != Rectangle.Empty && 
      IsVisibleOnAnyScreen(Properties.Settings.Default.WindowStartupLocation)) 
     { 
      this.WindowStartupLocation = WindowStartupLocation.Manual; 
      this.WindowState = (WindowState)Properties.Settings.Default.WindowState; 
      Height = Properties.Settings.Default.WindowStartupLocation.Size.Height; 
      Width = Properties.Settings.Default.WindowStartupLocation.Size.Width; 
      Left = Properties.Settings.Default.WindowStartupLocation.Left; 
      Top = Properties.Settings.Default.WindowStartupLocation.Top; 
     } 
     ... 

Когда я запустить приложение я получаю System.Windows.Markup .XamlParseException и Дополнительная информация: «Свойство привязки» не может быть установлено в свойстве «WindowStartupLocation» типа «MainWindow». «Связывание» может быть установлено только на DependencyProperty объекта DependencyObject.

Как исправить это?

ответ

6

Попробуйте использовать прилагаемое поведение, которое позволяет связать WindowStartupLocation свойство:

namespace YourProject.PropertiesExtension 
{ 
    public static class WindowExt 
    { 
     public static readonly DependencyProperty WindowStartupLocationProperty; 

     public static void SetWindowStartupLocation(DependencyObject DepObject, WindowStartupLocation value) 
     { 
      DepObject.SetValue(WindowStartupLocationProperty, value); 
     } 

     public static WindowStartupLocation GetWindowStartupLocation(DependencyObject DepObject) 
     { 
      return (WindowStartupLocation)DepObject.GetValue(WindowStartupLocationProperty); 
     } 

     static WindowExt() 
     {    
      WindowStartupLocationProperty = DependencyProperty.RegisterAttached("WindowStartupLocation", 
                 typeof(WindowStartupLocation), 
                 typeof(WindowExt), 
                 new UIPropertyMetadata(WindowStartupLocation.Manual, OnWindowStartupLocationChanged)); 
     } 

     private static void OnWindowStartupLocationChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
     { 
      Window window = sender as Window; 

      if (window != null) 
      { 
       window.WindowStartupLocation = GetWindowStartupLocation(window); 
      } 
     } 
    } 
} 

использование:

<Window 
    PropertiesExtension:WindowExt.WindowStartupLocation="{Binding ..}" /> 

Как указано в заявлении, WindowStartupLocation не является зависимой проетей, что означает, что вы не можете его привязать. Решение может быть либо из Window, либо для создания свойства зависимостей, либо с помощью приложенного поведения.

+0

Хм, проблема кажется более сложной, чем я. Но спасибо, плохо попробуйте :) – Lynct

-2

Вы не можете связать WindowsStartupLocation, эта строка генерирует ошибку:

WindowStartupLocation="{Binding WindowStartupLocation}" 

Вы можете установить его в какое-то конкретное значение, как и что:

WindowStartupLocation="CenterScreen" 
+0

@ Lynct специально пытается связать свойство для поддержки восстановления местоположения запуска окна. Он не хочет его жестко кодировать. – NathanAldenSr

Смежные вопросы