http://msdn.microsoft.com/zh-cn/library/cc838158(v=vs.95)

Silverlight

Silverlight  
 
Silverlight 横幅

Microsoft Silverlight 是一个跨浏览器、跨平台的 .NET Framework 实现,用于生成 Web、桌面和 Windows Phone 的媒体体验和丰富交互式应用程序。

本节中的文档适用于 Silverlight 5 Beta、Silverlight 4、Silverlight 3 和 Silverlight for Windows Phone。 有关版本差异,请在使用类库主题或查找其它主题类型中版本特定的字节时检查“版本信息”选项。 有关版本差异的更多信息,请参见 Silverlight 5 中的新增功能What's New in Silverlight for Windows Phone

以下各节说明如何使用 Silverlight 生成应用程序:

脱机文档

外部资源

 

http://msdn.microsoft.com/zh-cn/library/cc838158(v=vs.95)

posted @ 2012-05-22 14:48 DebugLZQ 阅读(37) 评论(0) 编辑

  关于Silverlight学习,国内的中文资料很少,李会军的《Silverlight的完美征程》、银光志《银光志:Silverlight 3.0开发详解与最佳实践》在国内还是有点名气的。我很久之前下了电子书看了下,要说我的读后感,可以毫不夸张的说---名不副其实!

  写本文的目的不是书托,因为要推荐的书不是我写的,我没有任何经济利益,单纯从技术角度来讲,这点我觉得很客观。本文也没有诋毁国内这2本书的意思,只是个人的读后感,从单纯的一个读者来讲,你写的烂就是烂,不能坑害园子里的其他博友了~作为读者,发表一点自己的感受总是可以的吧~

  大家都热爱技术,但从技术的角度来讲,我推荐的这本书是: Pro Silverlight 5 in C# 4th Edition Professional Apress 。

Book Description

  Silverlight 5 is the latest iteration of Microsoft's cross-browser technology for creating rich user experiences on the Web. Like its predecessor, it rides atop the .NET Framework for maximum ease of use and coding efficiency. The new technology carries forward much of the work that has been done before and augments it in many important respects, including support for H.264 video, major improvements to the graphics engine (including true 3D rendering), and much richer data-binding options for interfacing with other applications.

  Pro Silverlight 5 in C# is an invaluable reference for professional developers who want to discover the new features of Silverlight. Author Matthew MacDonald's expert advice guides you through creating rich media applications using Silverlight in the environment you're most productive in—no matter what the target platform. As you learn about the features that put Silverlight in direct competition with Adobe Flash, such as rich support for 2D and 3D drawing, animations, and media playback, you'll experience the plumbing of .NET and the design model of WPF through Silverlight—all of the same .NET technology that developers use to design next-generation Windows applications.

  Pro Silverlight 5 in C# is a comprehensive tutorial, written from professional developer to professional developer, featuring full-color graphics and screenshots.

What you’ll learn

  •     To develop rich media applications using Silverlight across browsers and platforms
  •     To create a project, set up a layout, and use controls
  •     To handle both 2D and 3D drawing, animation, and media playback through Windows Presentation Foundation (WPF)
  •     To integrate web services support
  •     To use Silverlight in conjunction with ASP.NET and its interactions with HTML

Who this book is for

  This book is for .NET developers encountering Silverlight for the first time. No prior knowledge of WPF or ASP.NET is assumed.

Table of Contents

  •     Introducing Silverlight
  •     XAML
  •     Layout
  •     Dependency Properties and Routed Events
  •     Elements
  •     The Application Model
  •     Navigation
  •     Shapes and Geometries
  •     Brushes and Transforms
  •     Animation
  •     Sound, Video, and Deep Zoom
  •     Styles and Behaviors
  •     Templates and Custom Controls
  •     Browser Integration
  •     ASP.NET and Web Services
  •     Data Binding
  •     Data Controls
  •     File Access
  •     Multithreading
  •     Networking
  •     Out-of-Browser Applications

淘宝上面的价格如下: 

(好贵啊~这本买不起~)

感谢万能的主啊,让DebugLZQ下载到了这本书的电子版PDF,需要的同学留个邮箱~

  感谢79楼提供的下载链接下载地址 (我没有测试过~)建议通过这里下载~。

  哪位博友有网盘的建个下载吧~把这个资源分享出去~通过邮箱发送真的好麻烦~

  请点击下面的"绿色通道"---"关注DebugLZQ”,共同交流进步~

posted @ 2012-05-22 10:55 DebugLZQ 阅读(2282) 评论(136) 编辑

今天是礼拜6,下雨,没有外出,闲暇就写一篇博文讲下如何在Winform中使用WPF控件。原有是我在百度上搜索相关信息无果,遂干脆动手自己实现。

WPF控件的漂亮是Winform无法匹及的,本文主旨是在Winform工程中如何使用WPF控件

先看下效果,如下图:

左边是传统的Winform控件,右边是DebugLZQ引入的WPF控件,我们可以很清楚的看到图片的“半透明”效果、TextBox的透明背景!界面很Cool吧~

下面就介绍下,这个创新性工程的创建过程,并附上所有代码:

首先,添加一个WPF自定义控件,控件的xaml很简单,代码如下:

<Grid  >        
        <Image  Margin="10,10,10,90" x:Name="img" Stretch="Uniform" Opacity="1">
            <Image.BitmapEffect>
                <DropShadowBitmapEffect Opacity="1" />
            </Image.BitmapEffect>
        </Image>
        <TextBox Background="Transparent"  Foreground="White" Height="40" FontSize="32" Margin="44,0,56,36" x:Name="txtBox1" Opacity="0.5" Text="" VerticalAlignment="Bottom" />
    </Grid>

其次,我们需要添加相应的设置效果的函数,代码如下:

        public void SetSource(string fileName)
        {
            img.Source = new BitmapImage(new Uri(fileName) );
        }

        public void SetOpacity(double opacity)
        {
            img.Opacity = opacity;
        }
        //
        public string GetText()
        {
            return txtBox1.Text;
        }

OK,以上步骤完成后我们建立一个Winform应用程序,添加先关的引用,这个非常重要,否则控件无法正常工作,引用的清单如下:

这里需要重点提出的是WindowsFormsIntegration这个引用。

我们编译整个项目,编译成功在工具箱中会出现相应的控件,如下图:

拖动这个控件到Winform窗体中,调用相应的函数。函数调用代码如下:

userControl11.SetSource(@"D:\临时文件\新建文件夹\DebugLZQ.jpg");
            
userControl11.SetOpacity(0.5);
string text = userControl11.GetText();

OK,至此程序完成。很简单强大吧~

再次看下效果图:

请点击下面的“绿色通道”--“关注DebugLZQ”,共同学习进步~Thank you for your Time!

posted @ 2012-05-19 13:51 DebugLZQ 阅读(1538) 评论(9) 编辑

本文灵感来自Andre Azevedo 在CodeProject上面的一片文章,An Asynchronous Socket Server and Client,讲的是异步的Socket通信。

关于技术博客,我觉得永远是老外的比较好~Andre Azevedo的这篇文章里,给出了一个很复杂的例子,内容涉及如下

  • Socket连接(Socket Connection)
  • Socket服务(Socket Service)
  • 连接主机(Connection Host)
  • 加密与压缩(Encrypt与Compress)
  • 请求入队(Enqueuing Requests)
  • 确保发送和接收(Ensure send and recieve)
  • 检查消息头(Check message header)
  • 检查空闲连接(Checking idle connections)
  • 加密服务
  • SSL认证(SSL authentication)
  • 对称认证(Symmetric authentication)
  • 连接创建者(Connection Creator)
  • Socket服务器与Socket侦听者(SocketServer and SocketListener)
  • Socket服务器构造函数与方法(SocketServer constructor and methods)
  • Socket客户端与Socket连接者(SocketClient and SocketConnector)
  • Socket客户端构造函数与方法(SocketClient constructor and methods)
  • 应答演示项目(Echo Demo Project)
  • 主机(Hosts)
  • 服务(Services)
  • 结语(Conclusion)
  • 版本历史(History)

本文仅实现一个相对简单的异步Socket服务器与客户端通信示例。

首先需要说明如下2个问题

1.同步、异步、多线程是什么关系?答:同步是等待返回,相当于阻塞式;异步是不等待返回,是非阻塞式,可以用多线程实现。

2.有些异步方法有两种实现方式, 如BeginAccept()和AcceptAsync(), 这两个方法有什么区别呢?答:  以 Begin 和 End 开头的方法是以 APM(Asynchronous Programming Model)设计方法实现的异步操作, 以 Async 结尾的方法是利用称为 EAP (Event-based Asynchronous Pattern) 的设计方法实现的异步操作。

界面简单如下:

主要代码如下:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Chatting
{
    public abstract class SocketFunc
    {
        //不管是服务端还是客户端, 建立连接后用这个Socket进行通信
        public Socket communicateSocket = null;

        //服务端和客户端建立连接的方式稍有不同, 子类会重载
        public abstract void Access(string IP, System.Action AccessAciton);

        //发送消息的函数
        public void Send(string message)
        {
            if (communicateSocket.Connected == false)
            {
                throw new Exception("还没有建立连接, 不能发送消息");
            }
            Byte[] msg = Encoding.UTF8.GetBytes(message);
            communicateSocket.BeginSend(msg,0, msg.Length, SocketFlags.None,
                ar => {
                
                }, null);
        }

        //接受消息的函数
        public void Receive(System.Action<string> ReceiveAction)
        {
            //如果消息超过1024个字节, 收到的消息会分为(总字节长度/1024 +1)条显示
            Byte[] msg = new byte[1024];
            //异步的接受消息
            communicateSocket.BeginReceive(msg, 0, msg.Length, SocketFlags.None,
                ar => {
                    //对方断开连接时, 这里抛出Socket Exception
                    //An existing connection was forcibly closed by the remote host 
                        communicateSocket.EndReceive(ar); 
                    ReceiveAction(Encoding.UTF8.GetString(msg).Trim('\0',' '));
                    Receive(ReceiveAction);
                }, null);
        }
    }


    public class ServerSocket:SocketFunc
    {
        //服务端重载Access函数
        public override void Access(string IP, System.Action AccessAciton)
        {
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //本机预使用的IP和端口
            IPEndPoint serverIP = new IPEndPoint(IPAddress.Any, 9050);
            //绑定服务端设置的IP
            serverSocket.Bind(serverIP);
            //设置监听个数
            serverSocket.Listen(1);
            //异步接收连接请求
            serverSocket.BeginAccept(ar =>
                {
                    base.communicateSocket = serverSocket.EndAccept(ar);
                    AccessAciton();
                }, null);
        }
    }

    public class ClientSocket:SocketFunc
    {
        //客户端重载Access函数
        public override void Access(string IP, System.Action AccessAciton)
        {
            base.communicateSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            base.communicateSocket.Bind(new IPEndPoint(IPAddress.Any, 9051));
            
            //服务器的IP和端口
            IPEndPoint serverIP;
            try
            {
                serverIP = new IPEndPoint(IPAddress.Parse(IP), 9050);
            }
            catch
            {
                throw new Exception(String.Format("{0}不是一个有效的IP地址!", IP));
            }
            
            //客户端只用来向指定的服务器发送信息,不需要绑定本机的IP和端口,不需要监听
            try
            {
                base.communicateSocket.BeginConnect(serverIP, ar =>
                {
                    AccessAciton();
                }, null);
            }
            catch
            {
                throw new Exception(string.Format("尝试连接{0}不成功!", IP));
            }
        }
    }
}

相关的事件处理程序,如下:

View Code
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Net.Sockets;

namespace Chatting
{
    public partial class MainForm : Form
    {

        public MainForm()
        {
            InitializeComponent();
        }

        SocketFunc socket;
        System.Action<string> ReceiveAction;
        System.Action AccessAction;

        private void MainForm_Load(object sender, EventArgs e)
        {
            //异步建立连接回调
            AccessAction = () =>
            {
                this.Invoke((MethodInvoker)delegate()
                {
                    lblFriendIP.Visible = false;
                    txtIP.Visible = false;
                    btnConnect.Visible = false;
                    btnWaitAccess.Visible = false;

                    String friendIP = socket.communicateSocket.RemoteEndPoint.ToString();
                    lblState.Text = String.Format("连接成功. 对方IP:{0}", friendIP);

                    try
                    {
                        socket.Receive(ReceiveAction);
                    }
                    catch (Exception exp)
                    {
                        MessageBox.Show(exp.Message, "错误");
                    }
                });

            };
            //异步接收消息回调
            ReceiveAction = msg =>
            {
                txtGetMsg.Invoke((MethodInvoker)delegate()
                {
                    UpdateGetMsgTextBox(false, msg, Color.Red);
                });
            };
        }

        private void btnWaitAccess_Click(object sender, EventArgs e)
        {
            this.socket = new ServerSocket();
            try
            {
                this.socket.Access("", this.AccessAction);
            }
            catch (Exception ecp)
            {
                MessageBox.Show(ecp.Message, "错误");
            }

            lblState.Text = "等待对方连接...";
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            this.socket = new ClientSocket();
            try
            {
                this.socket.Access(txtIP.Text, this.AccessAction);
            }
            catch (Exception ecp)
            {
                MessageBox.Show(ecp.Message, "错误");
            }
            lblState.Text = "正在连接对方...";
        }

        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            string message = txtSendMsg.Text.Trim();
            if (string.IsNullOrEmpty(message))
            {
                MessageBox.Show("消息内容不能为空!", "错误");
                txtSendMsg.Focus();
                return;
            }

            try
            {
                socket.Send(message);
            }
            catch(Exception ecp)
            {
                MessageBox.Show(ecp.Message, "错误");
                return;
            }

            UpdateGetMsgTextBox(true, message, Color.Blue);
            txtSendMsg.Text = "";
        }

        private void UpdateGetMsgTextBox(bool sendMsg, string message, Color color)
        {
            string appendText;
            if (sendMsg == true)
            {
                appendText = "Client:           " + System.DateTime.Now.ToString()
                    + Environment.NewLine
                    + message + Environment.NewLine;
            }
            else
            {
                appendText = "Server:           " + System.DateTime.Now.ToString()
                    + Environment.NewLine
                    + message + Environment.NewLine;
            }
            int txtGetMsgLength = txtGetMsg.Text.Length;
            txtGetMsg.AppendText(appendText);
            txtGetMsg.Select(txtGetMsgLength, appendText.Length - Environment.NewLine.Length*2 -message.Length);
            txtGetMsg.SelectionColor = color;

            txtGetMsg.ScrollToCaret();
        }

        private void txtSendMsg_Click(object sender, EventArgs e)
        {
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            BackColor = Color.FromArgb(50, 40, 60, 82);
        }
    }
}

 

效果,如下:

 

posted @ 2012-05-18 16:35 DebugLZQ 阅读(64) 评论(0) 编辑

---微软WPF带来的团队变化和软件技术变化

 Model-View-ViewModel是一种架构模式,主要在WPF、Silverlight和WP7开发里使用,它的目标是从视图层移除几乎所有代码隐藏(code-behind)。交互设计师可以专注于使用XAML表达用户体验需求,然后创建和视图模型的绑定,而视图模型则是由应用程序开发者开发和维护的。

      MVVM是更加通用的Presentation模式的一个具体实现。MVVM视图模型包含概念模型而不是数据模型,所有业务逻辑和其它操作都是在模型和视图模型里完成的。

      MVVM 把应用程序的状态和行为进行封装隔离了用户界面和用户体验部分,从而使得设计者与开发者可独立工作,并易于协作。开发者可迅速的投入代码开发中,只关注应用逻辑即可。如果实现一些相对较小,后期变化不大的应用程序,可能并不关注设计模式,使用设计模式反而带来复杂度。但ViewModel却具备良好的伸缩性,在小型应用中也可带来不菲的好处。它还易于在最终的应用程序中利用开始构建的原型系统,使得异步编程变得简单等等。

      在MVP模式中,为了让UI层能够从逻辑层上分离下来,设计师们在UI层与逻辑层之间加了一层interface。无论是UI开发人员还是数据开发人员,都要尊重这个契约、按照它进行设计和开发。这样,理想状态下无论是Web UI还是Window UI就都可以使用同一套数据逻辑了。

 

  与用户界面相关的最大的问题就是大量的凌乱的代码,

    a) 用户界面包含负责的逻辑用于维护界面相关对象;

    b) 包含了应用程序状态的维护;

  表现模式 (Presentation patterns) 就是围绕如何移除用户界面的复杂性,让界面更加简洁和可管理而产生的,下图就是常见表现模式的种类与分类: 

(1) MVC:模型-视图-控制器(Model View Controller),它强制性的使应用程序的输入、处理和输出分开。

(2) MVP:模型-视图-表现类(Model-View-Presenter)

(3) MVVM:模型-视图-视图模型(Model-View-ViewModel)

 

 

 

       (a) 发展过程:MVC->MVP->MVVM 

       (b)  MVC->MVP

       (c)  MVC、MVP->MVVM 

用户界面的3大问题:状态 (State) , 逻辑 (Logic) ,同步 (Synchronization)

  • 状态 (State) : 状态是用户界面最关心的问题之一。状态是用户界面数据的当前快照,在 Web 应用中,可能是 Session 级别的一个变量,在 Windows 应用中, 则可能只是界面级别的数据。 用户界面包含的状态越多, 则用户界面越复杂。
  • 逻辑 (Logic) : 用户界面往往包含界面逻辑,例如维护文本框、组合框或者其它任何界面元素,用户界面中这种逻辑越多,则用户界面越复杂。
  • 同步 (Synchronization) : 用户界面通常需要和业务组件协作,因此用户界面需要在界面元素与业务对象之间同步数据,如果用户界面包含的同步任务越多,则用户界面越复杂。
 

MVC

MVP

MVVM

 

V

C

V

P

V

VM

状态

 

   

逻辑

 

 

 

同步

 

 

表现设计模式 (Presentation Design Pattern)

  表现设计模式有助于解决上面列出的问题, 它的的基本逻辑就是创建一个额外的表现类 (Presenter) ,用来消化用户界面中复杂的逻辑,数据和同步的问题,从而使得用户界面变得简单明了。根据这个类承担责任的多少,决定了表现设计模式的类型,可能是 SC , PV , PM 等,也就是说,这个类的成熟度决定了它将是那种设计模式。

表现模型 (PM)

    1. ·表现类包含逻辑
    2. ·表现类包含状态
    3. ·表现类代表抽象的用户界面
    4. ·表现类不关注用户界面
    5. ·视图关注表现类
    6. ·视图与业务模型完全隔离 

 

 MVVM 

  • 继承自表现模型
  • 使用 WPF 以及 Silverlight 的绑定机制

MVC 

  • 没有表现类,有控制器 (Controller)
  • 请求首先到达控制器
  • 控制器负责绑定视图与业务模型
  • 逻辑存在于控制器中

 什么是 MVVM

  MVVM的提出源于WPF,主要是用于分离应用界面层和业务逻辑层,以前的ASP.Net三层架构是Web架构,MVVM是Windows应用程序架构。WPF用Xaml绘制界面,绘制完的界面是个独立的文件,文件里包含界面所有的样式和行为(行为是对行动的一种封装)。

为什么使用 MVVM

  MVVM实际上是三层架构,M层(Model实体层)、V层(View表示层,它有DataContext属性,这个属性可以使用DataTemplate模板绑定VM层的数据用来显示)、VM层(ViewModel层,对Model层进行CRUD进行操作,同时对V层提供数据绑定)。

 

命令对象

 漫谈消息 

 triggers,actions,behaviors

  

 

 

 

 

 

 

 

  传统的WinForm和ASP.NET应用程序是基于事件驱动开发的,以ASP.NET为例,在实际开发中,*.aspx页面用于渲染HTML,*.aspx.cs页面用于实现服务端逻辑,在开发初期,这种方式显得方便快捷,但是这种高耦合性导致了后期维护的复杂性,一旦aspx变化,aspx.cs的代码同时需要改变,比如将aspx中的GridView控件以FormView控件进行替换,对应的aspx.cs文件中不得不进行大量修改。而MVVM模式在WPF/SL应用程序中得以广泛应用的原因是,WPF/Siverlight应用程序是基于数据驱动的开发的,网上曾有研究者在WinForm下实现MVVM模式与WPF进行对比,得出结论:WinForm项目中大规模运用MVVM模式开发效率很低。

  与MVC,MVP所不同的是,MVVM的引入不仅仅是技术上解除耦合应对变化的原因,另外一个很大原因是:软件团队开发方式的改变.

  为什么MVC/MVP模式不行而MVVM可以呢? 很简单, 在MVC和MVP模式中, View层都具有很多代码逻辑, 开发View层的是程序员, 虽然UI/UE团队会做很多工作, 但这个层的"实现者"仍然是程序员. 在以前的开发中,其工作得很好, 而在WPF开发中程序员对View层的展现显得力不从心了,美工虽然很擅长, 但他会说"可惜我不会程序".于是, 我们需要一种方式将View层的代码逻辑抽取出来,并View层很纯粹以便完全让美工去打造它.相应地, 需要将View层的相应逻辑抽取到一个代码层上,以便让程序员专注在这里。

  我们只所以要在View(Xaml)背后写一些代码(C#), 无非是想传递一些数据以及传递数据时的数据的处理或在用户与界面控件进行交互时执行一些操作, 最简单的例子是在MVC中当界面发生交互时View去调用Controler中的某个方法, 以便将该操作的相应"指示"传递到"后台"去. 在以前的技术中, 这样的"衔接性"的代码是必须的.而在WPF中, 则可以通过另外的技术来进行层与层之间的"衔接", 这就是"Binding" 、"Command"、"AttachBehavior".通过Binding,我们可以实现数据的传递; 通过Command,我们可以实现操作的调用.Binding和Command是可以写在XAML中的, 这样看来XAML后面对于的CS文件可以被完全抛弃或不予理会了.这样的XAML文件正是美工所需要的. 而这些对于Binding以及Command的定义描述以及其他相关信息的代码应该放在那里呢,当然不是View, 更不是Model, 是"ViewModel". ViewModel是为这个View所量身定制的, 它包含了Binding是所需的相关信息,比如Converter以及为View的Binding提供DataContext, 它包含了Command的定义以便View层可以直接使用,另外,它还是一个变种的Controler, 它得负责业务流程的调度。

  在WPF/Silverlight中应用MVVM模式,View主要用于界面呈现,ViewModel用于逻辑实现,Model用于数据的构造,而这三者能够进行通信,最重要的是通过WPF/Silverlight中强大的数据绑定机制,将View和ViewModel有效的联系起来。

  尽管在MVVM模式的名称没有体现Command,但是在实际情形中,Command是实现MVVM至关重要的一环,目前项目主要采用了Prism框架中的DelegateCommand<T>类

  在Silverlight项目中采用MVVM模式,优势是显而易见的:

  1对于视图-逻辑的分离便于后期对原有功能扩展和维护,当UI变化时,ViewModel中的逻辑不需要进行变化

  2可以仅仅通过Blend实现简单的功能,而不需要写任何代码。

  在实现过程中,不要只是为了实现MVVM而MVVM,而应该根据实际情况进行取舍,事实上,由于Silverlight只是WPF的一个子集,其对MVVM模式在某些方面的支持仍有所欠缺:

  1 对枚举类型绑定比较困难,如将枚举类型绑定至RadioButton

  2 Silverlight4中仅仅对继承ButtonBase的控件实现了Command属性,在实际的使用中,对于其它的事件可以使用Blend4中中的InvokeCommandAction

  3 无法在View和ViewModel传递复杂对象,可以破坏View或者ViewModel作为折衷办法,如ChildWindow和父容器的对象传递

 有很多MVVM框架可以做到这点,其中一些是:

开源的

  • PRISM:由微软提供,和MEF/Unity一起用于依赖注入,支持组合命令,可以扩展MSDN上有详细的教程和演练。 
  • MVVM Light Toolkit:有visual Studio和Expression Blend的项目和项的模板。更多信息请看这里,另外可以参考VSExpression Blend的使用教程。
  • Caliburn Micro:支持视图模型先行(ViewModel-First)和视图先行(View-First)两种开发方式,通过co-routine支持异步编程。
  • Simple MVVM Toolkit:提供VS项目和项的模板,依赖注入,支持深拷贝以及模型和视图模型之间的属性关联。
  • Catel:包含项目和项的模板,用户控件和企业类库。支持动态视图模型注入,视图模型的延迟加载和验证。还支持WP7专用的视图模型服务。

闭源的

  • Intersoft ClientUI:付费的,只支持WPF和Silverlight,但是,除了MVVM框架,它还提供其它一些特性
  • Vidyano:免费但不开源。带有实体映射/虚拟持久化对象(数据容器),业务规则以及内置基于ACL的安全特性。

若想了解MVVM,可以参考以下资料:

使用MVVM的最大好处之一是分离关注点,以便用户体验设计师和应用程序开发者可以并行工作。另一方面,相关的担忧包括它对于UI操作比较简单的情况有点杀鸡用牛刀的感觉,数据绑定有点难以调试,以及大量使用数据绑定可能带来性能问题等等。

  Jonathan Allen在评论里提到几点错误使用MVVM的征兆:

1. 你的模型和视图模型名字相同。

  视图模型不应该是对模型的包装。视图模型的职责是外部服务的请求中介,比如加载和保存数据。而数据本身,以及验证和大多数业务逻辑应该放在模型里。

我经常强调这点。每当你创建一个视图模型包装一个模型,你就在你的API里引入一个巨大漏洞。具体地,任何直接引用这个模型的东西都可能以视图模型无法察觉的方式改变某个属性,因此UI也不会有相应的改变。同样地,模型里计算字段的任何更改也不会回传给视图模型。

2. 你的视图和视图模型名字相同。

  理想的情况下,视图模型是不知道使用它们的视图的,尤其是WPF应用程序有多个窗口共享相同的视图模型。

对于比较小型的应用程序来说,整个应用程序可能只需一个视图模型。对于比较大型的应用程序来说,主要功能可能需要一个视图模型,每个次要方面也需要一个,比如配置管理。

3. 你没有代码隐藏。

  代码隐藏既非一个好的东西,亦非一个坏的东西。它只是一个用来放置和视图或控件相关的逻辑的地方。因此,当我看到一个视图没有任何代码隐藏,我就会马上检查是否存在以下问题:

  • 视图模型是否通过名字接触了特定的控件?
  • 视图模型是否通过命令参数访问控件?
  • 是否使用了EventToCommand或其它可以导致泄露的行为而不是简单的事件处理程序?

MVVM Light的EventToCommand很有问题,因为它会使得控件从屏幕移除之后无法被垃圾回收。

4. 视图模型监听属性更改通知

  如果一个模型的的生命周期比监听它的事件的视图模型长,那么可能导致内存泄露。不同于视图有个Unloaded事件,视图模型对于生命周期管理没有很好的方案。因此如果它们关联到存活期比它们更长的视图模型的事件,视图模型将会出现泄露。

 

参考:

posted @ 2012-05-15 15:15 DebugLZQ 阅读(1294) 评论(9) 编辑

Windows Phone支持的数据库有哪些,不同数据库有什么优缺点,搜索了网上的相关资源,整理一下:

Windows Phone 7 database

http://winphone7db.codeplex.com/

Windows Phone 7 database是一个基于Isolated Storage (独立存储)来实现的数据库,发布在codeplex的开源数据库,使用MS开源许可证,可以自由使用到开源或者商业项目中,优点是免费,footprint非常的小,支持LINQ。缺点是太新,没有商用经验,稳定性不明确,没有管理工具,不支持SQL。

Perst Embedded Database For Microsoft Windows Phone 7

http://www.mcobject.com/perst_evalPerst是一个开源的对象数据库(object-oriented embedded database system),有.NET和Java的实现。 .NET的实现支持Silverlight和Windows Phone 7。这是双许可证,GPL和商用。GPL免费用在开源项目,商用需要购买许可证。支持多平台:.NET, .NET Compact Framewrok, Silverlight, Windows Phone.支持LINQ和JSQL,丰富的文档和例子程序。Footprint不大也不小,499k。

db4o

http://developer.db4o.com/db4o 是老牌的对象数据库(object-based database), 有Java和.NET版本的实现。 db4o for Silverlight版本可以用于Windows Phone。 db4o文档和例子程序都非常的丰富。支持Mono, .NET, .NET Compact Framework和Silverlight等平台,是最为成熟的产品。 其支持LINQ也同时支持原生查询,功能非常强大。db4o采用双许可证,GPLv2和商用,开源免费使用,商用需要购买。由于功能十分强大,footprint也非常的大,光Db4objects.Db4o.dll就有688k,加上其他组件差不多1M的大小。

siaqodb

http://siaqodb.com/siaqodb 是一个非开源的对象数据库, 可以运行在.NET 3.5+, Mono 2.4+, Silverlight 3/4 以及Windows Phone. LINQ是唯一支持的接口,不支持SQL,由于只是支持高版本,没有兼容性问题,footprint非常的小,只有128k,非常适合使用在Windows Phone上。而且siaqodb包含了Windows Phone 7的例子程序,方便开发,文档也比较全,还有包含查询工具,非常好用。是我觉得比较好的选择。唯一考虑的是非开源,只有商业许可证,$180个人许可证。还在考虑是否购买ing。

Sqlite for Windows Phone 7

http://sviluppomobile.blogspot.com/2010/03/sqlite-for-wp-7-series-proof-of-concept.html

Sqlite大名鼎鼎的嵌入式数据库,基本是智能手机设备的事实标准。Sqlite for Windows Phone 7修改自C# Sqlite,把存储介质改为Isolated Storage。其实我开始的时候偏向与使用Sqlite,因为其方便易用,移植性强,具有大量的商业经验,管理工具也十分的丰富,而且完全免费使用,没有许可证限制。但是Sqlite比较大,有514k,而且不支持LINQ,甚至不支持ADO.NET,只是支持sqlite原始的API,开发很不方便,例如读出的结果集不能放到DataSet和DataReader里面。

EffiProz Database for Windows Phone 7

http://www.effiproz.com/product_wp.aspx

http://effiproz.codeplex.com/

 

EffiProz Database 是另外一个开源的RDBMS数据库,支持Windows Phone,支持存储过程,触发器等功能,支持ADO.NET甚至Entity Framework,功能也异常强大。支持双许可证,开源使用MS开源许可证,商用单用户$400。可是这个数据库的footprint非常大,1361k,这么大的footprint令我失去了使用的兴趣了。同时开源版本不怎么更新,新功能模块都在商业版上实现。

SQL Server CE

Windows Phone的本地数据库SQL Server CE7.1版本即芒果更新的新特性,所以你要在应用程序中使用SQL Server CE数据库必须使用Windows Phone 7.1API才行。

 

参看文献:

Windows Phone 本地数据库概述 http://msdn.microsoft.com/zh-cn/library/hh202860(v=vs.92).aspx

浅谈Windows Phone 7本地数据库的选择 http://www.cnblogs.com/procoder/archive/2010/09/27/windows-phone-database.html

Windows Phone 7 本地数据库SQL Server CE(芒果更新)http://www.cnblogs.com/linzheng/archive/2011/06/08/2075593.html

  

posted @ 2012-05-14 11:33 DebugLZQ 阅读(1445) 评论(3) 编辑
摘要: 前面一篇博文中,分享了一个文件夹加密小工具,该工具是操作文件夹名称的方法实现文件夹的一般加密,文件夹中的文件(视频、图片等)都原封不动的保存在那里。 DebugLZQ在网上搜索相关文件加密的程序,发现给出的基本都是针对“字符创”、“文本”的加密与解密。对视频文件、图片等一般文件的加密解密程序少之又少,故写下此文,实现一个对一般文件进行加密的小工具。 程序的主要功能是:用户通过文件选择框选择要加密的文件-》输入密码进行加密;选择加密后的文件,输入密码进行解密。 程序的主界面如下: 三个按钮的Click事件处理程序如下: private void btnSelectFil...阅读全文
posted @ 2012-05-11 13:39 DebugLZQ 阅读(2103) 评论(25) 编辑
摘要: 用C#语言实现一个文件夹锁的程序,网上类似的“xxx文件夹xxx”软件很多,但是基本上都是C/C++语言实现的,且都没有提供源码(这个可以理解,毕竟是加密程序,不应该泄露源码)。 程序的基本原理是:用C#语言重命名文件夹,通过重命名使之成为windows安全文件的类标识符。具体的方法是为文件夹添加拓展名“.{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}”(.{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}是windows安全文件的类标识符),这时文件夹的图标就会变成一把锁,这样文件夹就被加锁了。 程序的主界面非常简洁,截图如下:...阅读全文
posted @ 2012-05-10 16:37 DebugLZQ 阅读(350) 评论(4) 编辑
摘要: 写作缘由 (Elo Ratings) ELO排名制度是当今对弈水平评估的公认的权威方法。它最初由物理学教授 Arpad Elo 创立,故命名为埃罗排名。埃罗排名最早应用于国际象棋和围棋,目前已广泛用于国际象棋、围棋、足球、篮球等运动。ELO算法先是在网游WOW取得了成功,现在11平台引进ELO算法实现了天梯系统,平台很受玩家的欢迎。 下面就详细介绍下这个排名算法。算法历史 ELO等级分制度是基于统计学的一个评估棋手水平的方法。美国国际象棋协会在1960年首先使用这种计分方法。由于它比先前的方法更公平客观,这种方法很快流行开来。1970年国际棋联正式开始使用等级分制度。 Elo模型原先采...阅读全文
posted @ 2012-05-06 18:36 DebugLZQ 阅读(1143) 评论(5) 编辑
摘要: JK_Rush是一个喜欢总结的人,这很好,是一个很好的习惯。取其精华,去其糟粕,站在巨人的肩膀上看的更远,理解的更深入,读完JK_Rush的这篇博文索引的一些总结,觉得对自己有帮助,JK_Rush在索引上理解的比我更加深入,值得学习享索引的一些总结如果说要对数据库进行优化,我们主要可以通过以下五种方法,对数据库系统进行优化。 1. 计算机硬件调优 2. 应用程序调优 3. 数据库索引优化 4. SQL语句优化 5. 事务处理调优在本篇博文中,我们将想大家讲述数据库中索引类型和使用场合,本文以SQL Server为例,对于其他技术平台的朋友也是有参考价值的,只要替换相对应的代码就行了!...阅读全文
posted @ 2012-05-04 11:04 DebugLZQ 阅读(25) 评论(0) 编辑