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.