Silverlight奇技銀巧6-UserControlの継承
10399 ワード
Silverlightでは、UserControlの継承はずっと面倒で、ASPよりもView(UserControlまたはPageおよびその他のベースクラス)を継承する必要があります.NETでは少し面倒です.UserControlのクラスで定義する継承だけでは様々な問題があり、例えば修正する.gファイル;さらに苦労をいとわない人は、バックグラウンドでXAMLをつづる方法を見つけました(ネットで検索するとわかります)、潔癖なプログラマーにとって、これらの解決策はあまり理想的ではありません.
実はsl 3から、msはすでに私たちにどのように正しくUserControlを継承するかなどを教えてくれて、あなたが新しいPage(注意して、UserControlではありません)を作れば端緒がわかります.
次に例を挙げます(コードは私が一時興った戦車大戦の雛形を切り取ります)まずベースクラスがあります.ここではBaseObject と呼ばれています.
ここでコードの意味は重要ではありませんが、ベースクラスであることを覚えておき、他のUserControlが継承しやすいようにします.次に派生クラス
この列のBrickはBaseObjectを継承しています.次が最も重要なステップです.というBrickのXAMLでは、 という定義をしています.
一般的なUserControlとは何か違いが見えますか?
1.まずXAMLでネーミングスペースを宣言します.この例では
2.そしてそれをUserControlのフォロー要素として、大体このようにします
運転してみて、少しも問題がないのではないでしょうか.小結 実は冒頭で述べたように、この方法はSilverlightに広く応用されています.例えばnavigation:Pageでは、あまり注目されていません.
個人的には、特に必要でなければ、このような継承をできるだけ避けるべきだと思います.結局、私たちの仕事量とコード理解の難しさもある程度増えています.私の提案はMVVMを活用することです.私たちのViewModelには共通のベースクラスがあるのではないでしょうか.
実はsl 3から、msはすでに私たちにどのように正しくUserControlを継承するかなどを教えてくれて、あなたが新しいPage(注意して、UserControlではありません)を作れば端緒がわかります.
次に例を挙げます(コードは私が一時興った戦車大戦の雛形を切り取ります)
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を継承しています.次が最も重要なステップです.
<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>
運転してみて、少しも問題がないのではないでしょうか.
個人的には、特に必要でなければ、このような継承をできるだけ避けるべきだと思います.結局、私たちの仕事量とコード理解の難しさもある程度増えています.私の提案はMVVMを活用することです.私たちのViewModelには共通のベースクラスがあるのではないでしょうか.