XAML で生成されたクラスから派生するクラスを定義する場合のビルド エラー MC6017

この記事は、拡張アプリケーション マークアップ言語 (XAML) で生成されたクラスから派生するクラスを定義するときに、ビルド エラー MC6017 が発生する問題を解決するのに役立ちます。

元の製品バージョン: .NET Framework
元の KB 番号: 957231

現象

Windows Presentation Foundation (WPF) アプリケーションがあります。 XAML を使用して定義された UserControl などのクラスがあります。 からクラスを派生させます UserControl。 例:

  • 基底クラス:

    <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>
    
  • 派生クラス:

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

このような場合は、次のエラー メッセージが表示されます。

xyz は XAML エラーを使用して定義されているため、XAML ファイルのルートにすることはできません。

原因

現在、別の XAML 生成クラスから XAML 生成クラスを派生させる方法はサポートされていません。

解決方法

XAML を使用せずに、コード内で基底クラスをすべて定義します。

派生クラスは、デザイン時にデザイナーでインスタンス化されません。つまり、コンストラクターから基底クラスに対して行われた呼び出しは呼び出されません。 さらに、コンストラクターで基底クラスのコンテンツを初期化しようとすると、その Content メンバーがまだ null に設定されていることがわかります。

これにより、実行時に派生クラスを設計している場合でも、基底クラスのコンテンツがデザイナーに表示されません。

回避策の 1 つは、基底クラスで次のようなコードを追加することです。

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

このようにして、基底クラスがメンバーを設定 Content するまで待ちます。