0

.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 での回答は問題ありません。

4

2 に答える 2

1

コードをリファクタリングして、アプリケーションの実行可能パスも使用することができます。

例えば:

If settings.Contains(Application.ExecutablePath & "_" & Me.Name & "_Location") Then
    SuidenSettings(Application.ExecutablePath & "_" & Me.Name & "_Location") = Me.Location
End If
于 2013-02-25T02:32:38.840 に答える
0

デレク・トーマスの答えは私を正しい軌道に乗せました。インスタンスが存在するアセンブリの名前を返すクラスでMe.GetType().Assembly.GetName().Name使用できると思います。CustomForm次に、設定を作り直して、アセンブリ+フォーム名を含めることができます。

それは私が求めていたものではありませんが、私が推測するトリックを実行します。

于 2013-02-25T04:32:48.557 に答える