Es wird tatsächlich anders gemacht, wenn es in XAML und nicht im Code definiert ist. Um dies zu überprüfen, können Sie ein einfaches Projekt in WPF mit einem einzigen Fenster erstellen und ein benutzerdefiniertes Steuerelement hinzufügen, das ein ControlTemplate in XAML durch seinen Standardstil definiert hat. Fügen Sie dann das Steuerelement zu Ihrem Fenster hinzu und fügen Sie eine Schaltfläche hinzu, deren Click-Handler einen Haltepunkt enthält.
Wenn der Haltepunkt erreicht ist, können wir das benutzerdefinierte Steuerelement und sein ControlTemplate untersuchen. Die VisualTree-Eigenschaft (die FrameworkElementFactory ist) ist null.
Mit Reflector können wir den entsprechenden Code in der Methode StyleHelper.ApplyTemplateContent sehen. Die erste if-Anweisung in dieser Methode wendet eine FrameworkElementFactory an (die von der VisualTreeProperty übergeben wird). Die zweite if-Anweisung lädt das ControlTemplate aus XAML, das schließlich FrameworkTEmplate.LoadOptimizedTemplateContent ausführt.