Buildfehler MC6017 beim Definieren einer Klasse, die von einer XAML-generierten Klasse abgeleitet ist

Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem der Buildfehler MC6017 auftritt, wenn Sie eine Klasse definieren, die von einer xaml-generierten Klasse (Extensible Application Markup Language) abgeleitet wird.

Ursprüngliche Produktversion:   .NET Framework
Ursprüngliche KB-Nummer:   957231

Problembeschreibung

Sie verfügen über eine WPF-Anwendung (Windows Presentation Foundation). Sie haben eine Klasse wie UserControl z. B. eine mit XAML definierte Klasse. Sie leiten eine Klasse von der UserControl ab. Zum Beispiel:

  • Basisklasse:

    <UserControl x:Class="WpfControlLibrary1.UserControlInXaml"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300">
        <Grid>
            <StackPanel>
                <Button>Test</Button>
            </StackPanel>
        </Grid>
    </UserControl>
    
  • Ableiten der Klasse:

    <y:UserControlInXaml x:Class="WpfApplication1.UserControlFromXaml"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:y="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1"
        Height="300" Width="300">
        <Grid>
            <CheckBox Height="16" Margin="8,30,0,0" Name="checkBox1"
            VerticalAlignment="Top" HorizontalAlignment="Left" Width="120">CheckBox</CheckBox>
        </Grid>
    </y:UserControlInXaml>
    

In diesem Fall wird die folgende Fehlermeldung angezeigt:

xyz kann nicht der Stamm einer XAML-Datei sein, da sie mithilfe eines XAML-Fehlers definiert wurde.

Ursache

Derzeit wird das Ableiten einer XAML-generierten Klasse von einer anderen XAML-generierten Klasse nicht unterstützt.

Lösung

Definieren Sie Ihre Basisklasse im Code, ohne XAML zu verwenden.

Die abgeleitete Klasse wird nicht im Designer instanziiert, wenn Sie sie entwerfen. Dies bedeutet, dass Aufrufe der Basisklasse über den Konstruktor nicht aufgerufen werden. Wenn Sie außerdem versuchen, den Inhalt der Basisklasse in ihrem Konstruktor zu initialisieren, stellen Sie fest, dass dieser Content Member immer noch auf NULL festgelegt ist.

Dies führt dazu, dass der Inhalt der Basisklasse nicht im Designer angezeigt wird, wenn Sie die abgeleitete Klasse entwerfen, obwohl dies zur Laufzeit der Fall ist.

Eine Möglichkeit zum Umgehen besteht darin, Code hinzuzufügen, der dem folgenden Code in der Basisklasse ähnelt:

public class UserControlInCode : UserControl
{
    protected override void OnContentChanged (object oldContent, object newContent)
    {
        base.OnContentChanged (oldContent, newContent);
        StackPanel panel = new StackPanel ();
        Button button = new Button ();
        button.Content = "Test";
        panel.Children.Add (button);
        ((IAddChild) newContent).AddChild (panel);
    }
}

Auf diese Weise warten Sie, bis die Basisklasse member Content festlegt.