Błąd kompilacji MC6017 podczas definiowania klasy pochodzącej z klasy wygenerowanej przez kod XAML

Ten artykuł pomaga rozwiązać problem polegający na tym, że błąd kompilacji MC6017 występuje podczas definiowania klasy pochodzącej z klasy wygenerowanej przez język XAML (Extensible Application Markup Language).

Oryginalna wersja produktu: .NET Framework
Oryginalny numer KB: 957231

Symptomy

Masz aplikację Windows Presentation Foundation (WPF). Masz klasę, taką jak zdefiniowana UserControl przy użyciu języka XAML. Klasę należy wywodzić UserControlz klasy . Przykład:

  • Klasa podstawowa:

    <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>
    
  • Klasa pochodna:

    <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>
    

W takiej sytuacji zostanie wyświetlony następujący komunikat o błędzie:

Xyz nie może być katalogiem głównym pliku XAML, ponieważ został zdefiniowany przy użyciu błędu XAML.

Przyczyna

Obecnie wyprowadzanie klasy wygenerowanej przez XAML z innej klasy wygenerowanej przez XAML nie jest obsługiwane.

Rozwiązanie

Zdefiniuj klasę bazową w kodzie bez użycia kodu XAML.

Klasa pochodna nie jest tworzone w projektancie podczas projektowania, co oznacza, że żadne wywołania do klasy bazowej z konstruktora nie są wywoływane. Ponadto jeśli spróbujesz zainicjować zawartość klasy bazowej w konstruktorze, okaże się, że Content element członkowski jest nadal ustawiony na wartość null.

Spowoduje to, że zawartość klasy bazowej nie jest wyświetlana w projektancie podczas projektowania klasy pochodnej, nawet jeśli jest ona wyświetlana w czasie wykonywania.

Jednym ze sposobów obejścia jest dodanie kodu podobnego do poniższego w klasie podstawowej:

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

W ten sposób czekasz, aż zestawy klasy podstawowej będą elementem Content członkowskim.