【问题标题】:I can't use Window.Show despite of creating new Window instance尽管创建了新的 Window 实例,但我不能使用 Window.Show
【发布时间】:2012-08-22 21:40:00
【问题描述】:

问题来了: 在我的 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

那我想在调用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... 关闭。

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

【问题讨论】:

  • 一旦窗口关闭,就不能再使用了。您需要创建一个类的 new 实例。在你的方法中射出一个相当大的漏洞。

标签: wpf vb.net xaml xamlreader


【解决方案1】:

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

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

但请注意,字典中的表单仍将保持上次使用时的状态。

【讨论】:

  • 感谢您的回答。我想我会按照你的建议使用 Hide() - 我仍然想知道为什么它适用于 XamlReader.Load 但不适用于字典。无论如何,谢谢!
  • XamlReader.Load 创建一个新实例,而不是将实例存储在字典中。
  • 有道理!谢谢厄诺!我想这意味着我没有任何机会使用 win.Show - win.Close 机制而不使用 XAMLReader 每次我想显示一个窗口?好吧,我想我会使用 Hide 来代替 windict - 对我来说似乎是最好的解决方案:)
  • 一个快速的想法:如果您使用 XamlReader 一次,在您刚刚创建的窗口上调用 GetType() 并将您获得的类型存储在字典中。从那时起要创建一个实例,您可以使用 Activator.CreateInstance 创建一个窗口并使用 Show and Close。
  • 好主意听起来很完美!我会试一试并报告结果,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多