3 Stimmen

Wie ElementHost-Steuerelement zu erhalten, angesichts einer der WPF-Steuerelement Inhalt

Ich versuche, einen Verweis auf das ElementHost-Steuerelement zu erhalten. Zum Beispiel im folgenden Code muss ich zunächst den Inhalt "testImage" des WPF-Benutzersteuerelements verwenden, um das Ereignis zu essen. Das WPF-Steuerelement wird zur Laufzeit hinzugefügt, ebenso wie das ElementHost-Steuerelement, so dass ich nicht den Namen des WPF-Steuerelements oder den Namen von ElementHost verwenden kann. Meine Logik ist es, das übergeordnete WPF-Benutzersteuerelement des "testImage" abzurufen, und dann das übergeordnete ElementHost des WPF-Benutzersteuerelements abzurufen. Aber ich bin mit Schwierigkeiten schreiben es in Code. Bitte beraten. Danke.

<UserControl x:Class="WpfTest”
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="300" Height="300">
    <Grid>
        <Label FontSize="10" Height="24" Margin="74,16,0,0" Name="testLabel" VerticalAlignment="Top" />
        <Image Name="testImage" Stretch="Uniform" HorizontalAlignment="Left" Width="64" Height="81" VerticalAlignment="Top" Margin="8,0,0,0"/>
    </Grid>
</UserControl>

2voto

Carl Rippon Punkte 4423

Hier ist ein Code, der Ihnen helfen könnte. Die wichtigsten Punkte sind:

  • Benennen Sie den ElementHost, wenn Sie ihn zur Laufzeit erstellen
  • Verwenden Sie die Hilfsfunktion FindVisualChildByName(), um den WPF-Baum zu durchsuchen und das gewünschte Steuerelement zu finden

Ich hoffe, das hilft!

  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim ElementHost1 As New System.Windows.Forms.Integration.ElementHost
        Dim WpfTest1 As New WindowsApplication1.WPFTest

        ElementHost1.Dock = DockStyle.Fill
        ElementHost1.Name = "ElementHost1"
        ElementHost1.Child = WpfTest1

        Me.Controls.Add(ElementHost1)
    End Sub

    Private Sub GetImageReference_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ElementHost1 As System.Windows.Forms.Integration.ElementHost = Me.Controls("ElementHost1")
        Dim TheGrid As System.Windows.Controls.Grid = CType(ElementHost1.Child, WPFTest).MyGrid
        Dim ImageTest As System.Windows.Controls.Image = FindVisualChildByName(TheGrid, "testImage")
        Stop
    End Sub

    Public Function FindVisualChildByName(ByVal parent As System.Windows.DependencyObject, ByVal Name As String) As System.Windows.DependencyObject
        For i As Integer = 0 To System.Windows.Media.VisualTreeHelper.GetChildrenCount(parent) - 1
            Dim child = System.Windows.Media.VisualTreeHelper.GetChild(parent, i)
            Dim controlName As String = child.GetValue(System.Windows.Controls.Control.NameProperty)
            If controlName = Name Then
                Return child
            Else
                Dim res = FindVisualChildByName(child, Name)
                If Not res Is Nothing Then
                    Return res
                End If
            End If
        Next
        Return Nothing
    End Function

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X