Error de compilación MC6017 al definir una clase que deriva de una clase generada por XAML

Este artículo te ayuda a resolver el problema en el que se produce el error de compilación MC6017 al definir una clase que deriva de una clase generada por lenguaje de marcado de aplicaciones extensibles (XAML).

Versión del producto original:   .NET Framework
Número KB original:   957231

Síntomas

Tiene una aplicación Windows Presentation Foundation (WPF). Tienes una clase como una UserControl definida mediante XAML. Deriva una clase de UserControl . Por ejemplo:

  • Clase base:

    <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>
    
  • Clase de derivación:

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

En esta situación, recibirá el siguiente mensaje de error:

xyz no puede ser la raíz de un archivo XAML porque se definió mediante un error XAML.

Causa

Actualmente, no se admite la derivación de una clase generada por XAML de otra clase generada por XAML.

Solución

Define tu clase base en el código sin usar XAML.

La clase derivada no se crea una instancia en el diseñador al diseñarla, lo que significa que no se llama a las llamadas realizadas a la clase base desde el constructor. Además, si intenta inicializar el contenido de la clase base en su constructor, encontrará que el miembro aún está Content establecido en null.

Esto da como resultado que el contenido de la clase base no aparece en el diseñador al diseñar la clase derivada, aunque lo haga en tiempo de ejecución.

Una forma de trabajar es agregar código similar al siguiente en la clase base:

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

De este modo, se espera hasta que la clase base establece el Content miembro.