Paradigm Shift Design

ISHITOYA Kentaro's blog.

独自に定義したUserControlを継承したクラスからコントロールを作成する

独自にDisplayObjectPanelというクラスをUserControlから継承して作成し、そこから派生してTextDisplayObjectPanel、ImageDisplayObjectPanelというクラスを作ろうとしたんだけれど、どうも一筋縄ではいかなかった。

UserControl-DisplayObjectPanelは単に継承すればよかったけれど、追加→新しい項目→Silverlightユーザーコントロールで作ったクラスのコード部分の継承元をDisplayObjectPanelにしても、

'com.semcode.tmboard.browser.player.sprite.TextDisplayObject' の partial 宣言では、異なる基本クラスを指定してはいけません。

とか言われてしまうので、苦し紛れに

<DisplayObjectPanel 
    x:Class="com.semcode.tmboard.browser.player.sprite.TextDisplayObject"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock x:Name="TextBlock"></TextBlock>
    </Grid>
</DisplayObjectPanel>

なんてしてみても、

The tag 'DisplayObjectPanel' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.

なぞと、VSがイヤイヤします。うぐぐと思いながら「Silverlight "異なる基本クラスを"」でググる

というページが。神がおった。
というわけで、

<sprite:DisplayObjectPanel 
    x:Class="com.semcode.tmboard.browser.player.sprite.TextDisplayObject"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sprite="clr-namespace:com.semcode.tmboard.browser.player.sprite"
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock x:Name="TextBlock"></TextBlock>
    </Grid>
</sprite:DisplayObjectPanel>

と定義してやるとよろしいです。ただし、ビルドしてやらないと、

CLR 名前空間が定義されていません。'clr-namespace' URI が、アセンブリに含まれていない名前空間 'com.semcode.tmboard.browser.player.sprite' を参照しています。

とか

型 'sprite:DisplayObjectPanel' が見つかりませんでした。アセンブリ参照が失われていないか、また、すべてのアセンブリがビルドされているかを確認してください。

とか、不精なことを言い出しますが、ビルドすれば消えます。
というわけで、ちょっとハマったのでメモでした。