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 再次打开它时出现错误,尽管我创建了一个新的 Window 实例?

System.InvalidOperationException 在窗口关闭后无法设置可见性或调用 Show、ShowDialog...。

但是当我不使用 Dictionary Method 而是直接使用 XAMLReader.Load 时它可以工作 - 有什么想法吗?不知何故,我通过返回 XamlReader.Load 得到的窗口似乎与字典中存储的信息不同?我错过了什么吗?提前致谢!

4

1 回答 1

1

你可以使用Hide()而不是Close()

Hide隐藏表单,因此您无需处理表单(及其控件),而是使其不可见。Show将使其再次可见。

不过要小心,字典中的表格仍将保持上次使用时的状态。

于 2012-08-22T12:42:49.810 回答