no entendi mucho tu respuesta
"al momento de crearlo darle una posicion left o top algo asi, pero no encuentro los left y top o que otro comando es"
Mi respuesta (el código que te mostré) pretendía darte la solución a esa duda para poder obtener la ubicación (left, top) del elemento en tiempo de ejecución. Pero haciéndolo desde WPF.
Al Grid que tienes actualmente podrías añadirle un Canvas, ya que este te facilitaría y simplificaría la tarea de posicionar controles como lo indica en la propia descripción:
"Defines an area within which you can explicitly position child elements by using coordinates that are relative to the Canvas area."Es decir:
Public Class UserControl1
Public Sub AgregarControl(ByVal Objeto As String) ' la variable objeto es para poner distintos controles segun la peticion
Dim b As New Button With {.Background = Brushes.Crimson, .Width = 20, .Height = 10, .Tag = 1}
b.VerticalAlignment = Rnd(2)
' Grid1.Children.Add(b)
Canvas1.Children.Add(b)
End Sub
End Class
Y entonces, para posicionar el user-control desde WindowsForms:
...
ElementHost1.Child = wpfButton
...
Dim element As UIElement = wpfButton
Dim position As New System.Drawing.Point(10, 10)
System.Windows.Controls.Canvas.SetLeft(element, CDbl(position.X))
System.Windows.Controls.Canvas.SetTop(element, CDbl(position.Y))
Ten en cuenta que ese código no te va a funcionar sin un Canvas.
Si prefieres no usar un Canvas y mantener el código actual de tu grid, entonces puedes usar la propiedad FrameworkElement.Margin, aunque no la he probado en todos los escenarios posibles...
He escrito un par de métodos / extensiones reutilizables para simplificarlo:
Public Module FrameworkElementExtensions
' Gets the coordinates of the source <see cref="FrameworkElement"/> element relative to its <see cref="ElementHost"/> container.
<Extension>
Public Function GetLocation(element As FrameworkElement) As System.Drawing.Point
Return New System.Drawing.Point(element.Margin.Left, element.Margin.Top)
End Function
' Sets the coordinates of the source <see cref="FrameworkElement"/> element relative to its <see cref="ElementHost"/> container.
<Extension>
Public Sub SetLocation(element As FrameworkElement, position As System.Drawing.Point)
element.Margin = New Thickness(position.X, position.Y, element.Margin.Right, element.Margin.Bottom)
End Sub
End Module
Esos métodos asumen que la propiedad Margin siempre devolverá el valor esperado, pero como ya digo no estoy del todo convencido de que vaya a ser así, dependiendo de factores que desconozco de la composición y alineación de los componentes de un Grid (yo prácticamente no programo nada en WPF).
Ejemplo desde WindowsForms:
...
ElementHost1.Child = wpfButton
wpfButton.SetLocation(New System.Drawing.Point(10, 10))
Debug.WriteLine(wpfButton.GetLocation())
...