独自に定義した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' が見つかりませんでした。アセンブリ参照が失われていないか、また、すべてのアセンブリがビルドされているかを確認してください。
とか、不精なことを言い出しますが、ビルドすれば消えます。
というわけで、ちょっとハマったのでメモでした。