Warum erkennt Window.FindName () das x: Name einer Schaltfläche in einem untergeordneten UserControl nicht? AKA Wie funktionieren NameScopes?

Im folgenden Beispielcode erstelle ich ein UserControl UserControldChild, das dem Hauptfenster Window1.xaml untergeordnet ist. Warum macht dasFindName() Methode nicht finden, die "myButton" im Code unten?

Das muss mit dem zu tun habenWPF XAML NameScopes, aber ich muss noch eine gute Erklärung finden, wie NameScope funktioniert. Kann mich jemand aufklären?

//(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 unten:

//(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();
    }
  }
}

Sollte dies nicht richtig beantwortet werden, habe ich eine Alternative zur Verwendung von FindName () dokumentiertin der post hier.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage