¿Por qué Window.FindName () no descubre el x: Nombre de un botón en un UserControl secundario? AKA, ¿cómo funcionan los NameScopes?

Así que en el código de ejemplo a continuación, creo un UserControl UserControldChild que es un elemento secundario de la ventana principal, Window1.xaml. ¿Por qué laFindName() ¿El método no encuentra el "myButton" en el código de abajo?

Esto debe tener que ver con laWPF XAML NameScopes, pero todavía tengo que encontrar una buena explicación sobre cómo funciona NameScope. ¿Puede alguien iluminarme?

//(xml) Window1.xaml    
<Window x:Class="VisualTreeTestApplication.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:VisualTreeTestApp="clr-namespace:VisualTreeTestApplication"
    Title="Window1" Height="400" Width="400">
    <Grid>
        <VisualTreeTestApp:UserControlChild/>
    </Grid>
</Window>

//(c#) Window1.xaml.cs
namespace VisualTreeTestApplication
{
  /// <summary>
  /// Interaction logic for Window1.xaml
  /// </summary>
  public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();
      Button btnTest = (Button)Application.Current.MainWindow.FindName("myButton");
      // btnTest is null!
    }
  }
}

UserControl a continuación:

//(wpf) UserControlChild.xaml
<UserControl x:Class="VisualTreeTestApplication.UserControlChild"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid x:Name="myGrid">      
        <Button x:Name="myButton" Margin="20" >Button</Button>
    </Grid>
</UserControl>

//(c#) UserControlChild.xaml.cs (no changes)
namespace VisualTreeTestApplication
{
  /// <summary>
  /// Interaction logic for UserControlChild.xaml
  /// </summary>
  public partial class UserControlChild : UserControl
  {
    public UserControlChild()
    {
      InitializeComponent();
    }
  }
}

En caso de que esto no se responda correctamente, encontré una alternativa al uso de FindName () documentadoen el post aqui.

Respuestas a la pregunta(1)

Su respuesta a la pregunta