Public Class WindowStateIniBehavior Private Shared ReadOnly IsReady As New Dictionary(Of Window, Boolean) Public Shared Function GetPersistenceKey(obj As DependencyObject) As String Return CStr(obj.GetValue(PersistenceKeyProperty)) End Function Public Shared Sub SetPersistenceKey(obj As DependencyObject, value As String) obj.SetValue(PersistenceKeyProperty, value) End Sub Public Shared ReadOnly PersistenceKeyProperty As DependencyProperty = DependencyProperty.RegisterAttached( "PersistenceKey", GetType(String), GetType(WindowStateIniBehavior), New PropertyMetadata(Nothing, AddressOf OnKeyChanged) ) Private Shared Sub OnKeyChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs) Dim Window = TryCast(d, Window) If IsNothing(Window) Then Return IsReady(Window) = False AddHandler Window.Loaded, Sub() LoadState(Window) AddHandler Window.ContentRendered, Sub() IsReady(Window) = True End Sub AddHandler Window.LocationChanged, Sub() SaveState(Window) AddHandler Window.SizeChanged, Sub() SaveState(Window) End Sub Private Shared Sub SaveState(Window As Window) If Not IsReady(Window) Then Return EgtUILib.WritePrivateProfileString(S_EXECUTEWINDOW, K_LEFT, Window.Left.ToString(), Map.refMainWindowVM.DimensionDir) EgtUILib.WritePrivateProfileString(S_EXECUTEWINDOW, K_TOP, Window.Top.ToString(), Map.refMainWindowVM.DimensionDir) EgtUILib.WritePrivateProfileString(S_EXECUTEWINDOW, K_WIDTH, Window.Width.ToString(), Map.refMainWindowVM.DimensionDir) EgtUILib.WritePrivateProfileString(S_EXECUTEWINDOW, K_HEIGHT, Window.Height.ToString(), Map.refMainWindowVM.DimensionDir) End Sub Private Shared Sub LoadState(Window As Window) Dim sLeft As String = String.Empty Dim dLeft As Double = 0 EgtUILib.GetPrivateProfileString(S_EXECUTEWINDOW, K_LEFT, String.Empty, sLeft, Map.refMainWindowVM.DimensionDir) If sLeft IsNot String.Empty Then StringToDouble(sLeft, dLeft) Dim sTopD As String = String.Empty Dim dTop As Double = 0.0 EgtUILib.GetPrivateProfileString(S_EXECUTEWINDOW, K_TOP, String.Empty, sTopD, Map.refMainWindowVM.DimensionDir) If sTopD IsNot String.Empty Then StringToDouble(sTopD, dTop) Dim sWidth As String = String.Empty Dim dWidth As Double = 0.0 EgtUILib.GetPrivateProfileString(S_EXECUTEWINDOW, K_WIDTH, String.Empty, sWidth, Map.refMainWindowVM.DimensionDir) If sWidth IsNot String.Empty Then StringToDouble(sWidth, dWidth) Dim sHeight As String = String.Empty Dim dHeight As Double = 0.0 EgtUILib.GetPrivateProfileString(S_EXECUTEWINDOW, K_HEIGHT, String.Empty, sHeight, Map.refMainWindowVM.DimensionDir) If sWidth IsNot String.Empty Then StringToDouble(sHeight, dHeight) If dLeft > 0 Then Window.Left = dLeft If dTop > 0 Then Window.Top = dTop If dWidth > 0 Then Window.Width = dWidth If dHeight > 0 Then Window.Height = dHeight End Sub End Class