【问题标题】:How to properly expose Windows form object to other classes如何正确地将 Windows 窗体对象公开给其他类
【发布时间】:2016-05-19 18:30:11
【问题描述】:

我有一个基本问题。我正在创建一个 VSTO Word 插件。我有一个功能区按钮,它打开一个名为 TableSelector 的 WPF 对话框。它以 Windows 形式托管。

Public Class RibbonControl

Private f As Form

Private Sub btnSelectTable_Click(sender As Object, e As RibbonControlEventArgs) Handles btnSelectTable.Click
    Dim h As New System.Windows.Forms.Integration.ElementHost()
    Dim tableselector1 As New TableSelector
    f = New Form()
    f.MaximumSize = New Size(500, 380)
    f.MinimumSize = New Size(500, 380)
    f.MaximizeBox = False
    f.Name = "HostForm"
    h.Dock = DockStyle.Fill
    h.Child = tableselector1
    f.Controls.Add(h)
    f.Show()
    f.TopMost = True
End Sub

Public ReadOnly Property hostForm() As Form
    Get
        Return f
    End Get
End Property

End Class

然后我在该 WPF 控件上有一个关闭按钮来关闭对话框。当我单击它时,出现运行时错误“对象引用未设置为对象的实例”。在下面代码的第 3 行。

Private Sub btnClose_Click(sender As Object, e As RoutedEventArgs) Handles btnClose.Click
    Dim ribbon As New RibbonControl()
    ribbon.hostForm.Close()
End Sub

我错过了什么?

【问题讨论】:

    标签: wpf vb.net vsto


    【解决方案1】:

    您可以使用以下代码获取关闭的特定窗口

    Window win = Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.Name == "Window Name");
    win.Close();
    

    【讨论】:

    • 您好,感谢您的快速回复。我不明白 SingleOrDefault 方法的使用。 “w”代表什么?
    • 你检查过这段代码是否有效吗? SingleOrDefault 检查窗口集合并根据指定条件返回单个窗口实例,即 (w => w.Name == "Window Name") 。这意味着它将从 windows 集合中选择一个窗口 w,其中 w.Name 等于 与您的窗口名称相对应的某个字符串值。您需要更多地学习 LINQ 和 LAMBDA 表达式。
    • 我无法尝试,因为 1) 它在 C# 中,并且 2) 插件项目不同。例如,VSTO 插件中可用的 Application 对象没有 Current 方法。我试图查询 Globals.ThisAddin.Application.Windows 集合,但它根本不包含对话框。仅打开的文档。我宁愿修复上面发布的代码。
    • 将 f 变量从 Private 更改为 Public Shared 解决了这个问题。感谢您尝试帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多