2016-05-19 4 views
-1

Ich habe eine grundlegende Frage. Ich erstelle ein VSTO Word Addin. Ich habe eine Ribbon-Schaltfläche, die ein WPF-Dialogfeld namens TableSelector öffnet. Es wird in einem Windows-Formular gehostet.Wie Windows-Formularobjekt anderen Klassen ordnungsgemäß verfügbar machen

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 

Dann habe ich eine Schließen-Schaltfläche auf diesem WPF-Steuerelement, um das Dialogfeld zu schließen. Wenn ich darauf klicke, bekomme ich den Laufzeitfehler "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt". in Zeile 3 des folgenden Codes.

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

Was fehlt mir?

Antwort

0

Sie können folgenden Code verwenden, um ein bestimmtes Fenster für

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

Hallo, vielen Dank für Ihre schnelle Antwort nahe. Ich verstehe die Verwendung der SingleOrDefault-Methode nicht. Was bedeutet "w"? – miro

+0

Haben Sie überprüft, ob dieser Code funktioniert? SingleOrDefault prüft die Sammlung von Fenstern und gibt eine einzelne Fensterinstanz gemäß der angegebenen Bedingung zurück, dh (w => w.Name == "Fenstername"). Das heißt, es wird ein Fenster ** w ** aus der Windows-Sammlung ausgewählt, wobei ** w.Name ** gleich ** einem Zeichenfolgenwert entspricht, der Ihrem Fensternamen entspricht **. Sie müssen LINQ- und LAMBDA-Ausdrücke mehr lernen. – ViVi

+0

Ich kann es nicht versuchen, weil 1) es in C# und 2) Addin-Projekte sind unterschiedlich. Beispielsweise hat das Anwendungsobjekt, das in einem VSTO-Add-In verfügbar ist, keine aktuelle Methode. Ich habe versucht, die Globals.ThisAddin.Application.Windows-Auflistung abzufragen, aber es enthält das Dialogfeld überhaupt nicht. Nur geöffnete Dokumente. Ich würde es vorziehen, den oben angegebenen Code zu korrigieren. – miro

Verwandte Themen