Silverlight奇技銀巧6-UserControlの継承

10399 ワード

Silverlightでは、UserControlの継承はずっと面倒で、ASPよりもView(UserControlまたはPageおよびその他のベースクラス)を継承する必要があります.NETでは少し面倒です.UserControlのクラスで定義する継承だけでは様々な問題があり、例えば修正する.gファイル;さらに苦労をいとわない人は、バックグラウンドでXAMLをつづる方法を見つけました(ネットで検索するとわかります)、潔癖なプログラマーにとって、これらの解決策はあまり理想的ではありません.
実はsl 3から、msはすでに私たちにどのように正しくUserControlを継承するかなどを教えてくれて、あなたが新しいPage(注意して、UserControlではありません)を作れば端緒がわかります.
次に例を挙げます(コードは私が一時興った戦車大戦の雛形を切り取ります)
  • まずベースクラスがあります.ここではBaseObject
  • と呼ばれています.
    using System.Windows;
    
    using System.Windows.Controls;
    
    
    
    namespace EternalTank {
    
        public class BaseObject : UserControl {
    
            double _x;
    
            public double X {
    
                get {
    
                    _x = Canvas.GetLeft(this);
    
                    return _x;
    
                }
    
    
    
                set {
    
                    Canvas.SetLeft(this, value);
    
                    _x = value;
    
                }
    
            }
    
    
    
            double _y;
    
            public double Y {
    
                get {
    
                    _y = Canvas.GetTop(this);
    
                    return _y;
    
                }
    
    
    
                set {
    
                    Canvas.SetTop(this, value);
    
                    _y = value;
    
                }
    
            }
    
    
    
            public ObjectDirection Direction { get; set; }
    
    
    
            /// <summary>
    
            ///      
    
            /// </summary>
    
            public double Speed {
    
                get { return (double)GetValue(SpeedProperty); }
    
                set { SetValue(SpeedProperty, value); }
    
            }
    
    
    
            public static readonly DependencyProperty SpeedProperty =
    
                DependencyProperty.Register("Speed", typeof(double), typeof(BaseObject), new PropertyMetadata(10d));
    
        }
    
    }
    
    
    
    

    ここでコードの意味は重要ではありませんが、ベースクラスであることを覚えておき、他のUserControlが継承しやすいようにします.
  • 次に派生クラス
  • namespace EternalTank.Assets {
    
        public partial class Brick : BaseObject {
    
            public Brick() {
    
                InitializeComponent();
    
            }
    
        }
    
    }

    この列のBrickはBaseObjectを継承しています.次が最も重要なステップです.
  • というBrickのXAMLでは、
  • という定義をしています.
    <my:BaseObject x:Class="EternalTank.Assets.Brick"
    
        xmlns:my="clr-namespace:EternalTank"
    
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    
        mc:Ignorable="d"
    
        d:DesignHeight="300" d:DesignWidth="400">
    
        <Grid x:Name="LayoutRoot" Background="White">
    
            <Rectangle Fill="Red" Width="13" Height="13"></Rectangle>
    
        </Grid>
    
    </my:BaseObject>
    
    

    一般的なUserControlとは何か違いが見えますか?
    1.まずXAMLでネーミングスペースを宣言します.この例では
  •  
  •  
    xmlns:my="clr-namespace:EternalTank"
    
    


  • 2.そしてそれをUserControlのフォロー要素として、大体このようにします

    <my:BaseObject>

    </my:BaseObject>


    運転してみて、少しも問題がないのではないでしょうか.
  • 小結
  • 実は冒頭で述べたように、この方法はSilverlightに広く応用されています.例えばnavigation:Pageでは、あまり注目されていません.
    個人的には、特に必要でなければ、このような継承をできるだけ避けるべきだと思います.結局、私たちの仕事量とコード理解の難しさもある程度増えています.私の提案はMVVMを活用することです.私たちのViewModelには共通のベースクラスがあるのではないでしょうか.