这是问题所在: 在我的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的存储信息不同?我错过了什么吗?提前谢谢!
答案 0 :(得分:1)
您可以使用Hide()
代替Close()
Hide
隐藏了表单,因此不会丢弃表单(及其控件),而是使其不可见。 Show
会再次显示它。
但要小心,字典中的表单仍将保持上次使用时的状态。