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ć UserControl
z 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.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla