1

問題は次のとおりです。WPFアプリケーションでは、XamlReader.Loadメソッドを使用して.xamlファイルをロード/解析し、アプリケーションでウィンドウを開いていました。

ウィンドウを返す私の関数のコードフラグメント:

Dim win As New Window()
Dim myObject As Object

Dim xml As XmlReader = XmlReader.Create("mysample.xaml")
myObject = System.Windows.Markup.XamlReader.Load(xml)
win = CType(myObject, Window)
Return win

これを使用して、ユーザーが見たいと思うさまざまなウィンドウをすべて表示します。

ユーザーがwin.Closeで別のウィンドウに切り替えたら、win.Showでウィンドウを開いて閉じます。それはうまくいきます!

パフォーマンスを向上させるために、アプリケーションの開始時にすべてのXAMLReader.Loadを実行し、情報をディクショナリに格納する予定です。

Private Shared windict As Dictionary(Of String, Object)

Public Shared Sub ConvertXAMLToWindow(ByVal formName As String)
      windict = New Dictionary(Of String, Object)
      Dim myObject As Object
      Dim xml As XmlReader = XmlReader.Create(formName)
      myObject = System.Windows.Markup.XamlReader.Load(xml)
      windict.Add(formName, myObject)
End Sub

次に、ウィンドウを呼び出すときにその情報を使用します。

If windict.ContainsKey(formName) Then
 Dim win As New Window()
 Dim myObject As Object

 myObject = windict(formName)
 win = CType(myObject, Window)
 Return win
End If

これでうまくいきますが、win.Closeを使用してウィンドウを閉じると、ウィンドウの新しいインスタンスを作成しましたが、win.Showでウィンドウを再度開こうとするとエラーが発生します。

System.InvalidOperationExceptionウィンドウを閉じた後、可視性を設定したり、Show、ShowDialog...を呼び出したりすることはできません。

しかし、Dictionaryメソッドを使用せずにXAMLReader.Loadを直接使用する場合は機能します-何かアイデアはありますか?どういうわけか、XamlReader.Loadを返すことによって得られるウィンドウは、dictから保存された情報とは異なるように見えますか?私は何かが欠けていますか?前もって感謝します!

4

1 に答える 1

1

Hide()代わりに使用できますClose()

Hideフォームを非表示にするため、フォーム(およびそのコントロール)を破棄する代わりに、フォームを非表示にします。Show再び表示されます。

ただし、辞書のフォームは、前回使用されたときの状態を保持していることに注意してください。

于 2012-08-22T12:42:49.810 に答える