.NET 4 winforms には、いくつかのプロジェクトを含むソリューションがあります。これらのプロジェクトのうちの 2 つでは、各フォームのフォーム設定を覚えておきたいので、各フォームは、参照として取得されたフォームの名前を使用して、位置、サイズなどの設定クラスを保存およびロードする「CustomForm」から継承します。
参考までに、CustomForm
コードは次のようになります。
Public Class CustomForm : Inherits Form
Private ReadOnly Property SuidenSettings As My.MySettings
Get
Return My.MySettings.Default
End Get
End Property
''' <summary>
''' Restore the window settings from the settings file
''' </summary>
''' <remarks></remarks>
Public Sub RestoreSettings() Handles MyClass.Load
Dim state As FormWindowState
Dim settings As List(Of String) = SuidenSettings.Properties.Cast(Of SettingsProperty).Where(Function(p) p.Name.StartsWith(Me.Name)).Select(Function(p) p.Name).ToList()
Dim primaryWorkArea As Rectangle = Screen.PrimaryScreen.WorkingArea
' Make sure each setting exists before accessing or exceptions will fly
If settings.Any() Then
If settings.Contains(Me.Name & "_Location") Then
Me.Location = CType(SuidenSettings(Me.Name & "_Location"), Point)
End If
If settings.Contains(Me.Name & "_Size") Then
Me.Size = CType(SuidenSettings(Me.Name & "_Size"), Size)
End If
If settings.Contains(Me.Name & "_State") Then
If [Enum].TryParse(SuidenSettings(Me.Name & "_State").ToString(), state) Then
Me.WindowState = state
Else
Me.WindowState = FormWindowState.Normal
End If
End If
End If
' Verify that the form is actually positioned on screen, otherwise position it on the primary screen
If Not IsOnScreen() Then
Me.Location = New Point(Me.Location.X Mod primaryWorkArea.Width, Me.Location.Y Mod primaryWorkArea.Height)
If Not primaryWorkArea.Contains(New Rectangle(Me.Location, Me.Size)) Then
Me.Location = New Point(primaryWorkArea.Top, primaryWorkArea.Left)
End If
End If
End Sub
''' <summary>
''' Save the form settings to the settings file
''' </summary>
Public Overridable Sub SaveSettings() Handles MyClass.FormClosed
Dim settings As List(Of String) = SuidenSettings.Properties.Cast(Of SettingsProperty).Where(Function(p) p.Name.StartsWith(Me.Name)).Select(Function(p) p.Name).ToList()
' Make sure each setting exists before accessing or exceptions will fly
If settings.Any() Then
If settings.Contains(Me.Name & "_Location") Then
SuidenSettings(Me.Name & "_Location") = Me.Location
End If
If settings.Contains(Me.Name & "_Size") Then
SuidenSettings(Me.Name & "_Size") = Me.Size
End If
If settings.Contains(Me.Name & "_State") Then
SuidenSettings(Me.Name & "_State") = Me.WindowState
End If
Call SuidenSettings.Save()
End If
End Sub
''' <summary>
''' Check if the form is at least partially visible on screen
''' </summary>
''' <returns>True if the form is partially visible on screen, else false</returns>
Private Function IsOnScreen() As Boolean
Dim formRectangle As Rectangle = New Rectangle(Me.Location, Me.Size)
Return Screen.AllScreens.Any(Function(s) s.WorkingArea.IntersectsWith(formRectangle))
End Function
End Class
まだ単一のプロジェクトがあり、うまく機能したときにこのアプローチを使用しました。今、私はそのプロジェクトを複製して 2 つを実行する必要がありました (わずかに異なるプログラムを並べて実行します。なぜそうしなければならなかったのかは聞かないでください。そのため、オブジェクトを取り出して、CustomForm
両方のアプリケーション プロジェクトで参照する別のプロジェクトに配置しました。
CustomForm
私が今抱えている問題は、共有プロジェクトの設定ファイルではなく、フォームが使用されているプロジェクトにローカルな設定ファイルを参照するようにコードを変更する方法がわからないことです.
フォーム設定はフォーム名を使用して取得され、両方のプロジェクトは実質的に同一であるため、すべてのフォームに同じ名前が付けられます。プロジェクト内のすべてのフォームの名前をわずかに異なる名前に変更し、代わりにプロジェクトのローカル設定ファイルから設定をロードする必要はありません。それは可能ですか?
C# または VB.NET での回答は問題ありません。