尽管创建了新的Window实例,但我无法使用Window.Show

时间:2012-08-22 11:52:27

标签: wpf vb.net xaml xamlreader

这是问题所在: 在我的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.Show打开窗口并关闭它,当用户使用win.Close切换到另一个窗口时。它运作良好!

现在为了提高性能,我计划在Application Start中执行所有XAMLReader.Load并将信息存储到Dictionary中:

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

然后我想在调用windows时使用该信息:

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 ...在Window之后   闭合。

但是当我不直接使用字典方法而是直接使用XAMLReader.Load时它会起作用 - 任何想法是什么?不知怎的,我通过返回XamlReader.Load获得的窗口似乎与来自dict的存储信息不同?我错过了什么吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用Hide()代替Close()

Hide隐藏了表单,因此不会丢弃表单(及其控件),而是使其不可见。 Show会再次显示它。

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