Как получить элемент управления ElementHost, учитывая один из элементов управления WPF - PullRequest
2 голосов
/ 29 января 2010

Я пытаюсь получить ссылку на элемент управления ElementHost. Например, в приведенном ниже коде мне нужно сначала использовать содержимое «testImage» пользовательского элемента управления WPF для запуска события. Элемент управления WPF добавляется во время выполнения, как и элемент управления ElementHost, поэтому я не могу использовать имя элемента управления WPF или имя ElementHost. Моя логика состоит в том, чтобы получить родительский пользовательский элемент управления WPF для «testImage», а затем получить родительский элемент ElementHost пользовательского элемента управления WPF. Но у меня проблемы с записью кода. Пожалуйста, порекомендуйте. Спасибо.

<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>

1 Ответ

2 голосов
/ 29 января 2010

Вот код, который может вам помочь. Ключевые моменты:

  • Назовите ElementHost при создании во время выполнения
  • Используйте функцию помощи FindVisualChildByName (), чтобы найти дерево WPF и получить нужный элемент управления

Надеюсь, это поможет!

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...