惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
罗磊的独立博客
F
Fortinet All Blogs
T
Threatpost
Y
Y Combinator Blog
博客园_首页
美团技术团队
Security Latest
Security Latest
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
V
V2EX - 技术
The Cloudflare Blog
L
LINUX DO - 热门话题
博客园 - 司徒正美
Jina AI
Jina AI
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
The Hacker News
The Hacker News
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Latest news
Latest news
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
雷峰网
雷峰网
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
W
WeLiveSecurity
D
DataBreaches.Net
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
S
Securelist
Help Net Security
Help Net Security

博客园 - 紫色永恒

一段旅程的结束和另一端旅程的开始 Silverlight Client←→Server数据同步备忘代码 Expression Blend 5 Preview For Silverlight5 RC已发布 Siverlight5新功能/改进总结 [译]WCF RIA Services中的集合(2) [译]WCF RIA Services中的集合(1) Silverlight通过MVVM实现多语言实时切换(含源代码) Silverlight中服务通信方式的选择(WCF、Data Service、Ria Service) 你应该知道的,那些未在Silverlight5Beta中出现的特性 记录来敦煌一周的情况 Silverlight奇技银巧7 - 巧用文件生成时间强制客户端载入最新xap文件 [ASP.NET MVC3]Chart的ActionResult扩展 如何将ASP.NET MVC2项目升级到MVC 3 RC Silverlight 4 GDR 1 更新 Silverlight 4 Training Kit更新 Silverlight4的DataGrid改进与Toolkit2010.4中的新玩意 Win03+IIS6部署.NetFramework4(ASP.NET4)的一点小经验 4.13 Silverlight4 Will Come Silverlight4RC的API汇总(文本文件)
Silverlight奇技银巧6 - UserControl的继承
紫色永恒 · 2010-05-24 · via 博客园 - 紫色永恒

在Silverlight中,UserControl的继承一直是个麻烦事情,要继承一个View(UserControl或者Page以及其他基类)比在ASP.NET中要麻烦一些。仅仅的在UserControl的类中定义继承会存在各种各样的问题,比如说要修改.g文件;更有不辞辛苦者竟然找到了用后台拼XAML的方式(网上一搜便知),对于有洁癖的程序员,这些解决方案都不是非常理想。

其实从sl3开始,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,以方便其他的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难道不可以有一个共同的基类吗:)