色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

WPF 基礎(chǔ)到企業(yè)應(yīng)用系列3——WPF開發(fā)漫談

1.開篇前言

     首先很高興這個(gè)系列能得到大家的關(guān)注和支持,基于對(duì)大家負(fù)責(zé)和對(duì)自己負(fù)責(zé)的態(tài)度,我會(huì)不斷努力寫好這個(gè)系列,分享自己的微薄技術(shù)和經(jīng)驗(yàn),希望在幫助別人的同時(shí)也不斷提升自己。由于這篇文章稍多,所以讀者花的時(shí)間長了一些,也希望大家能夠見諒,這個(gè)系列以后會(huì)每周發(fā)三到四篇左右(主要是寫一篇差不多要花幾晚上,感覺思維比較發(fā)散),除了講WPF技術(shù)本身之外,也會(huì)講一些項(xiàng)目具體開發(fā),所以敬請(qǐng)關(guān)注。在前兩次的文章中我們對(duì)WPF有了一個(gè)比較全面的認(rèn)識(shí),那么在本篇文章當(dāng)中,除了講一些理論知識(shí)外,我們會(huì)從實(shí)際的開發(fā)中進(jìn)行講解,用理論和代碼的形式來詮釋W(xué)PF的簡單開發(fā)過程。

2.本文提綱

· 1.開篇前言

· 2.本文提綱

· 3.WPF開發(fā)基礎(chǔ)

· 4.Expression系列工具簡單介紹

· 5.其他工具介紹

· 6.WPF和WinForm案例

. 7.漫談WPF開發(fā)

· 8.本文總結(jié)

. 9.系列進(jìn)度

3.WPF開發(fā)基礎(chǔ)

    本系列文章默認(rèn)情況下,開發(fā)環(huán)境為Windows XP+SP3英文版和Visual Studio 2008+SP1英文版。要使用Windows 7  Professional和Visual Studio 2010開發(fā)環(huán)境的時(shí)候會(huì)附加說明。在搭建好開發(fā)環(huán)境之后,打開VS2008,選擇創(chuàng)建項(xiàng)目(Create Project),出現(xiàn)如下圖所示的選擇項(xiàng)目模板的對(duì)話框: 

 7-4-2010 3-24-35 PM

    在項(xiàng)目模板選擇對(duì)話框中選擇WPF Application,修改項(xiàng)目名稱(Name)(已經(jīng)截圖完畢,所以沒能改名,望見諒),和存儲(chǔ)位置(Location),點(diǎn)擊 確定 (OK)按鈕,便成功創(chuàng)建了一個(gè)WPF應(yīng)用程序,模板中文件層次結(jié)構(gòu)如下圖所示(在References里面自動(dòng)引入了圖一中的PresentationCore、PresentationFramework、WindowsBase三大核心程序集):

image

圖二

7-4-2010 3-36-42 PM

在App.xaml中,指定項(xiàng)目運(yùn)行時(shí)啟動(dòng)的是窗體:Window1,還可以定義我們需要的系統(tǒng)資源以及引入程序集等,詳細(xì)看下圖介紹:

7-4-2010 4-00-27 PM

在Window1.xaml中設(shè)計(jì)窗體的外觀,首先,我們將窗體的Title更改為:XAMLWithScript,然后設(shè)置窗體的其他屬性和事件 。完成了這些設(shè)置以后,我們就可以對(duì)窗體添加內(nèi)容了,本實(shí)例對(duì)窗體添加了一個(gè)Button,然后對(duì)Button進(jìn)行了一些簡單的設(shè)置,詳細(xì)如下圖所示:

7-4-2010 2-54-11 PM

上圖沒有對(duì)一些概念講全,所以下面這幅圖用另外一個(gè)窗體對(duì)某些概念進(jìn)行了補(bǔ)充,由于我把很多概念都畫到了圖里面,所以在此就不做過多解釋,詳細(xì)如下:

7-4-2010 3-08-26 PM

由于每個(gè)概念都比較細(xì)且多的緣故,所以這里只是對(duì)一些基本的概念和元素進(jìn)行了展示,后續(xù)文章會(huì)做一一介紹,也歡迎和大家一起討論!

4.Expression工具的使用

    由于自己主攻方向不在這個(gè)方面,所以對(duì)這些工具也只是會(huì)使用而已,會(huì)用Expression做一些基本的效果和應(yīng)用,但更多時(shí)候都是在visual studio里面手寫代碼,不過有的時(shí)候?yàn)榱伺浜厦拦みM(jìn)行代碼集成,也會(huì)接觸這些工具。

    在 Expression Design 中打開作品文件。(這個(gè)作品有可能是你用其他工具創(chuàng)建的,也可以是你用Expression Design 設(shè)計(jì)的,但個(gè)人認(rèn)為它還是沒有Photoshop/CorelDraw/Fireworks等工具好用。)
    如果要導(dǎo)出切片,請(qǐng)從“工具箱”中選擇“切分”工具,圍繞所要導(dǎo)出的作品區(qū)域繪制一個(gè)矩形,然后在“屬性”面板中的“編輯切片”下,設(shè)置切片的屬性(如“Name”)。
單擊“文件”菜單上的“導(dǎo)出”。此時(shí),將顯示“導(dǎo)出”對(duì)話框。
在“要導(dǎo)出的項(xiàng)”下,選擇以下選項(xiàng)之一:

  • “整個(gè)文檔”   導(dǎo)出文檔中的所有作品。
  • “選定對(duì)象”   只導(dǎo)出那些在美工板上選定的項(xiàng)目。
  • “切片”   只導(dǎo)出生成的切片。您可以根據(jù)情況選擇更改所顯示的每個(gè)切片的屬性。

接下來設(shè)置“格式”,請(qǐng)選擇以下任一選項(xiàng):

  • “XAML Silverlight 畫布”   導(dǎo)出單個(gè) XAML 文件,其中包含表示為畫布版式面板中的對(duì)象的所有作品。您可以在 Expression Blend 3中將此 XAML 文件導(dǎo)入到 Microsoft Silverlight 項(xiàng)目內(nèi),以用作獨(dú)立的文檔(啟動(dòng)的 XAML 文件或以編程方式加載的 XAML 文件),或?qū)?duì)象復(fù)制并粘貼到另一個(gè) XAML 文檔中。
  • “XAML WPF 圖形畫筆”   導(dǎo)出一個(gè)資源字典,其中包含表示為圖形畫筆資源的所有作品。您可以在 Expression Blend 3 中將此 XAML 文件導(dǎo)入到 Windows Presentation Foundation (WPF) 項(xiàng)目內(nèi),然后將這些資源應(yīng)用于項(xiàng)目中的對(duì)象的畫筆屬性。
  • “XAML WPF 畫布”   導(dǎo)出單個(gè) XAML 文件,其中包含表示為畫布版式面板中的對(duì)象的所有作品。您可以在 Expression Blend 3 中將此 XAML 文件導(dǎo)入到 Windows Presentation Foundation 項(xiàng)目內(nèi),以用作獨(dú)立的文檔(啟動(dòng)的 XAML 文件或以編程方式加載的 XAML 文件),或?qū)?duì)象復(fù)制并粘貼到另一個(gè) XAML 文檔中。您還可以在 Expression Blend 3 的“設(shè)計(jì)”視圖中打開該文件,右鍵單擊任意一個(gè)或多個(gè)對(duì)象,然后通過選擇“工具”菜單上的選項(xiàng),利用這些對(duì)象來創(chuàng)建按鈕或用戶控件。

在對(duì)話框底部的“位置”框旁邊,鍵入導(dǎo)出文件所在的文件夾的路徑(我們這里就保存在D盤)。還可以設(shè)置下列選項(xiàng):

如果決定導(dǎo)出“整個(gè)文檔”或“選定對(duì)象”,還需要輸入文件的名稱。如果決定導(dǎo)出“切片”,則可以根據(jù)情況選擇一個(gè)版式面板以包含所有對(duì)象。

單擊“全部導(dǎo)出”以導(dǎo)出文件。

image

在 Expression Blend 3 中打開的項(xiàng)目內(nèi),單擊“項(xiàng)目”菜單上的“添加現(xiàn)有項(xiàng)”。

在“添加現(xiàn)有項(xiàng)”對(duì)話框中,瀏覽找到所導(dǎo)出的一個(gè)或多個(gè) XAML 文件,選擇這些文件,然后單擊“打開”。

image

5.其他的一些工具

    除了上面我們用到的Expression Design、Expression Blend和Visual Studio以外,我們還會(huì)用到一些其他的工具,比如一些調(diào)試工具、一些性能優(yōu)化工具和XAML查看工具。

KaXaml是一個(gè)輕量級(jí)的XAML編輯器,用它之前我們一直都是用XAMLPad,但是用了KaXaml以后才發(fā)現(xiàn)XAMLPad是那么的不好用,并且KaXaml是開源的,在codeplex上進(jìn)行了發(fā)布,感興趣的朋友也可以下載它的源代碼進(jìn)行研究。

它主要的功能如下:

1,內(nèi)置諸多代碼片段(模版)

2,內(nèi)置ColorPicker

3,xaml  scrubber : 可以幫你清理你的XAML代碼

4,支持語法高亮和智能提示

image

其他的一些工具和資源,園子里周金根做了一些收集,我在這里也不做一一介紹了,大家可以看一下他的博客,詳細(xì)地址:WPF - 資源收集,我覺得整理的非常的不錯(cuò)。

6.WPF和WinForm案例

  • 介紹

這個(gè)例子主要展示同一個(gè)需求用WinForm和WPF分別進(jìn)行實(shí)現(xiàn),通過這個(gè)例子,我們可以看到兩者之間的區(qū)別和聯(lián)系,同時(shí)也可以對(duì)我們的項(xiàng)目選型帶來一定的參考作用(原型來自于Josh Smith的一篇文章,個(gè)人覺得講得非常不錯(cuò),所以對(duì)原有例子進(jìn)行了改造,進(jìn)而有了這個(gè)案例)。

當(dāng)然作為一項(xiàng)新技術(shù),WPF帶來了很多功能,但在使用這些功能的同時(shí)也會(huì)帶來很多缺點(diǎn),這是不可避免的,正所謂”有利必有弊“吧!所以我們這個(gè)例子并不是講WPF有如何如何的好,怎樣用WPF代替WinForm,而是從兩者實(shí)現(xiàn)同一個(gè)需求進(jìn)行簡單的對(duì)比。

這個(gè)例子是用Visual Studio 2008編寫的,所以大家可以下載下來進(jìn)行查看.

  • 特別聲明

這個(gè)程序并不是要展現(xiàn)聲明優(yōu)秀的架構(gòu)也不是為了宣揚(yáng)WPF的種種好處,所以沒有采用當(dāng)前比較熱門的MVP、MVVM模式進(jìn)行開發(fā),同時(shí)項(xiàng)目當(dāng)中你可以看到很隨意的代碼,沒有對(duì)IOC、AOP以及設(shè)計(jì)模式進(jìn)行應(yīng)用,這也是考慮到具體需求和例子簡單的原因,況且這里也沒有必要,我們?cè)谧鲰?xiàng)目的時(shí)候也要時(shí)刻注意什么時(shí)候用什么開發(fā)框架、開發(fā)模式以及項(xiàng)目整體架構(gòu)。

  • 程序概覽

這個(gè)例子非常簡單,需求就是展示三大社區(qū)的基本信息,同時(shí)你可以在輸入框?qū)ζ溥M(jìn)行修改,當(dāng)焦點(diǎn)切換的時(shí)候,你就會(huì)看到它會(huì)自動(dòng)進(jìn)行修改,你把鼠標(biāo)放在圖片上面會(huì)提示社區(qū)的ID等等。我在這里沒有用復(fù)雜的邏輯和高深的架構(gòu),只是想通過這個(gè)例子展示W(wǎng)inForm的WPF的差異和聯(lián)系,所以在程序處理上可能會(huì)有很多漏洞,比如沒有對(duì)輸入進(jìn)行驗(yàn)證,你可以輸入空格和任意字符等。

下面是WinForms版本的截圖:

SNAGHTML995710

下面是WPF版本的截圖:

SNAGHTML9a790b

如果你編輯了某個(gè)社區(qū)的中文名稱或者英文名稱,然后把焦點(diǎn)移到另外一個(gè)地方,這些更改就會(huì)通過右上角的全名體現(xiàn)出來,因?yàn)樗麄兌际峭ㄟ^綁定到公用字段來實(shí)現(xiàn)這些操作的。

整個(gè)項(xiàng)目結(jié)構(gòu)如下圖所示:

整個(gè)項(xiàng)目一共就三個(gè)工程,第一個(gè)工程BusinessObjects 是WpfApp和WinFormsApp公用的業(yè)務(wù)類庫,WinFormsApp是用WinForm實(shí)現(xiàn)的版本,WpfApp是用WPF實(shí)現(xiàn)的版本。那么我們下面就簡單分別進(jìn)行一些介紹:

  • 公用代碼部分(BusinessObjects)

這兩個(gè)應(yīng)用程序都是使用的BusinessObjects作為邏輯類庫,BusinessObjects中的Company對(duì)UI所使用的數(shù)據(jù)進(jìn)行了Mock。所以他們?cè)谛枨蠓矫娑际且粯拥模捎诒容^簡單,所以請(qǐng)看下面代碼:

Collapse

using System;
using System.ComponentModel;
using System.IO;
using System.Reflection;

namespace BusinessObjects
{
public class Company : INotifyPropertyChanged
{
#region Creation

public static Company[] GetCompanys()
{
// In a real app this would probably call into a data access layer to get records from a database.
return new Company[]
{
new Company(1, "博客園", "CNBlogs", GetPictureFile(1), new DateTime(2004, 1, 12)),
new Company(2, "51CTO", "51CTO", GetPictureFile(2), new DateTime(2005, 3, 1)),
new Company(3, "CSDN", "CSDN", GetPictureFile(3), new DateTime(2000, 1, 20)),
};
}

private static string GetPictureFile(int CompanyID)
{
string fileName = String.Format("emp{0}.jpg", CompanyID);
string folder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
folder = Path.Combine(folder, "Images");
return Path.Combine(folder, fileName);
}

private Company(int id, string chineseName, string EnglishName, string pictureFile, DateTime startDate)
{
this.ID = id;
this.chineseName = chineseName;
this.EnglishName = EnglishName;
this.PictureFile = pictureFile;
this.StartDate = startDate;
}

#endregion // Creation

#region Properties

public int ID { get; private set; }

string _chineseName;
public string chineseName
{
get { return _chineseName; }
set
{
if (value == _chineseName)
return;

_chineseName = value;

this.OnPropertyChanged("chineseName");
this.OnPropertyChanged("FullName");
}
}

string _EnglishName;
public string EnglishName
{
get { return _EnglishName; }
set
{
if (value == _EnglishName)
return;

_EnglishName = value;

this.OnPropertyChanged("EnglishName");
this.OnPropertyChanged("FullName");
}
}

public string FullName
{
get { return String.Format("{0}, {1}", this.EnglishName, this.chineseName); }
}

public string PictureFile { get; private set; }
public DateTime StartDate { get; private set; }

#endregion // Properties

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}

#endregion
}
}

上面這段代碼沒有什么不尋常的地方,大家寫WinForm和ASP.NET也會(huì)寫這樣的邏輯類,只是要注意Company 實(shí)現(xiàn)了INotifyPropertyChanged 接口,大家看到這個(gè)接口只有一個(gè)OnPropertyChanged的方法,這個(gè)方法就是我們要說的屬性變更通知方法,就是說當(dāng)一個(gè)屬性改變了,我們需要做些什么來響應(yīng)這些改變。

  • WinForms實(shí)現(xiàn)介紹

WinForms版本就包含一個(gè)Form 和一個(gè)展示社區(qū)信息的custom UserControl, 這個(gè)Form 包含了一個(gè)FlowLayoutPanel控件, 它主要的作用就是用來承載每個(gè)社區(qū)的實(shí)例. 那么代碼就如下所示:

Collapse

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

// Create and initialize a usercontrol for each Company.
foreach(Company com in Company.GetCompanys())
{
CompanyControl comCtrl = new CompanyControl();
comCtrl.Company = com;
this.flowLayoutPanel.Controls.Add(comCtrl);
}
}
}

CompanyControl是我們創(chuàng)建的一個(gè)UserControl,由于每個(gè)CompanyControl都要顯示一個(gè)Company對(duì)象的屬性值,我在這里使用了BindingSource控件來進(jìn)行綁定,這樣做也是為了和WPF更接近考慮(增強(qiáng)對(duì)比性,呵呵)。具體如下截圖:

 

如上圖所示,我們用了BindingSource來獲取數(shù)據(jù),但有一個(gè)屬性除外,那就是Company ID,請(qǐng)看下面代碼:

Collapse

namespace WinFormsApp
{
///
///
A WinForms control that displays an Company object.
///
public partial class CompanyControl : UserControl
{
public CompanyControl()
{
InitializeComponent();

// Convert the picture file path to a Bitmap.
Binding binding = this.CompanyPicture.DataBindings[0];
binding.Format += this.ConvertFilePathToBitmap;
}

void ConvertFilePathToBitmap(object sender, ConvertEventArgs e)
{
e.Value = Bitmap.FromFile(e.Value as string);
}

public Company Company
{
get { return this.CompanyBindingSource.DataSource as Company; }
set
{
this.CompanyBindingSource.DataSource = value;

// The Company's picture shows a tooltip of their ID.
if (value != null)
{
string msg = "Company ID: " + value.ID;
this.toolTip.SetToolTip(this.CompanyPicture, msg);
}
}
}
}
}

這里有幾點(diǎn)需要注意.在綁定的時(shí)候,我們對(duì)PictureFile 字段進(jìn)行了轉(zhuǎn)換,這個(gè)是必須做的. 如果不那樣做, 這個(gè)圖片會(huì)綁定失敗,因?yàn)樵诮壎ǖ臅r(shí)候它不能自動(dòng)把string類型直接轉(zhuǎn)化為Image類型.

現(xiàn)在我們已經(jīng)把Company綁定到了我們的控件上, 這里我需要給PictureBox一個(gè)tooltip的效果. 這個(gè)tooltip將顯示 Company ID, 前綴顯示為 "Company ID:". 現(xiàn)在這個(gè)是在代碼里面寫的,沒有在窗體中發(fā)現(xiàn)有WPF ToolTip等類似的工具,不知道大家用到過沒有?

總的來說, 這是一個(gè)很簡單的例子,我們的大部分功能也是用代碼沒有寫代碼,是通過visual designer進(jìn)行實(shí)現(xiàn)的.然后通過一部分代碼把它銜接起來, 我們看到Windows Forms是一個(gè)非常快速和實(shí)用的開發(fā)平臺(tái).

  • WPF實(shí)現(xiàn)介紹

WPF版本我這里就做得很簡單了,由于開發(fā)WPF程序提供了很多模板和工具,所以我這里基本沒寫什么代碼,全部的代碼都是通過XAML實(shí)現(xiàn),并且大部分都是自動(dòng)生成的,只是我們要根據(jù)項(xiàng)目具體情況做一些修改就行。

這個(gè)WPF項(xiàng)目同樣有一個(gè)Window 和一個(gè)custom UserControl, 和 WinForms 版本基本一樣. 只是WinForms中用 FlowLayoutPanel來承載EmployeeControls 控件, 而WPF 用的是ItemsControl 來承載這個(gè)用戶控件.更加可喜的是,WPF通過模板來進(jìn)行定制,所以我們就不需要像WinForms那樣寫循環(huán)加載控件的代碼,下面就是WPF用XAML實(shí)現(xiàn)的窗體代碼:

Collapse

<Window 
x:Class="WpfApp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp"
xmlns:model="clr-namespace:BusinessObjects;assembly=BusinessObjects"
Title="WPF App" Height="558" Width="581"
WindowStartupLocation="CenterScreen"
>
<
Window.DataContext>
<
ObjectDataProvider
ObjectType="{x:Type model:Company}"
MethodName="GetCompanys"
/>
Window.DataContext>
<
Grid Width="555">
<
Label
Name="label1"
HorizontalContentAlignment="Center" VerticalAlignment="Top"
FontSize="20" FontWeight="Bold"
Height="36.6" Margin="0,16,0,0"
>
.NET 中文社區(qū)大比拼Label>
<
ItemsControl
ItemsSource="{Binding}"
HorizontalContentAlignment="Center"
Margin="46,59,25,0"
Focusable="False"
>
<
ItemsControl.ItemTemplate>
<
DataTemplate>
<
local:CompanyControl />
DataTemplate>
ItemsControl.ItemTemplate>
ItemsControl>
Grid>
Window>

在如下的XAML代碼中,這里有幾點(diǎn)需要注意,。Window的DataContext賦予了一個(gè)ObjectDataProvider的對(duì)象,而ObjectDataProvider又會(huì)調(diào)用GetEmployees這個(gè)方法。所以一旦把DataContext設(shè)置到Company 對(duì)象,并且把ItemsControl的ItemsSource設(shè)置為“{Binding}” 就意味著該控件里面會(huì)自動(dòng)顯示Company 對(duì)象的所有數(shù)據(jù)。

這里我們并不需要像WinForm一樣用循環(huán)的方式創(chuàng)建CompanyControl的實(shí)例。這是因?yàn)镮temsControl中的ItemTemplate屬性設(shè)置為了一個(gè)DataTemplate,同時(shí)ItemsControl中的ItemsSource綁定到了Company 的對(duì)象數(shù)組,那么ItemTemplate就會(huì)知道如何創(chuàng)建一個(gè)CompanyControl,所以大家看到這里寫的代碼就相對(duì)變少了,這也是XAML的一個(gè)優(yōu)點(diǎn)之一。

該CompanyControl的后臺(tái)CS文件也是空的(除了必須的InitializeComponent),所以它不像的WinForms應(yīng)用程序那么累贅,界面和邏輯緊密的耦合在了一起。下面就是CompanyControl的XAML代碼, 這個(gè)代碼相對(duì)來說就比較簡單了。

Collapse

<UserControl x:Class="WpfApp.CompanyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="137" Width="481">
<
Border
BorderBrush="Black"
BorderThickness="1"
Margin="2"
SnapsToDevicePixels="True" Width="469">
<
Grid Height="129" Width="451">
<
Image Source="{Binding PictureFile}"
Margin="10" Name="image1" Stretch="Fill"
Width="150" Height="80" HorizontalAlignment="Left" >
<
Image.ToolTip>
<
TextBlock>
<
Run TextBlock.FontWeight="Bold">Company ID:Run>
<
TextBlock Margin="4,0,0,0" Text="{Binding ID}" />
TextBlock>
Image.ToolTip>
Image>

<
Label
Content="{Binding FullName}"
Height="34" Margin="99,2,0,0"
Name="中英文名稱"
VerticalAlignment="Top"
HorizontalContentAlignment="Right"
FontSize="16" FontWeight="Bold" />

<
Label Margin="190,34,0,0" Name="chineseNameLabel"
FontWeight="Bold" Height="28"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Width="73">中文名稱:Label>
<
TextBox
Text="{Binding chineseName}"
HorizontalAlignment="Right" Margin="0,39,10,0"
Name="textBox1" Width="172" Height="23"
VerticalAlignment="Top" TextDecorations="None" />

<
Label FontWeight="Bold" Height="28" Margin="190,0,0,34"
Name="EnglishNameLabel" VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Width="73">英文名稱:Label>
<
TextBox
Text="{Binding EnglishName}"
Height="23" Margin="0,0,10,34" Name="textBox2"
VerticalAlignment="Bottom" HorizontalAlignment="Right"
Width="172" />

<
Label Height="28" Margin="190,0,185,2"
Name="startDateLabel" VerticalAlignment="Bottom"
FontWeight="Bold">創(chuàng)建日期:Label>
<
Label
Content="{Binding StartDate}"
Height="28" HorizontalAlignment="Right" Margin="0,0,10,2"
Name="startDateValueLabel" VerticalAlignment="Bottom"
Width="172" />
Grid>
Border>
UserControl>

如上面的代碼所示,UI上的很多元素我們都可以通過拖控件進(jìn)行實(shí)現(xiàn),有個(gè)功能需要自己簡單的寫一寫代碼,UI上面有一個(gè)功能就是你把鼠標(biāo)放在圖片上的時(shí)候會(huì)提示Company ID,這個(gè)功能通過ToolTip屬性進(jìn)行實(shí)現(xiàn)的。ToolTip屬性是WPF所有元素的基類FrameworkElement的一個(gè)屬性,所以我們可以在這些子元素當(dāng)中直接使用。

那么大家注意到,這個(gè)小功能在WinForm中我們要寫一些代碼,而在WPF就可以直接通過屬性定制,所以在很多方面WPF對(duì)這些方面都做了封裝和簡化,也提高了我們的開發(fā)效率。

  • 案例總結(jié)

      通過上面的案例,我們主要認(rèn)識(shí)到:如果不需要強(qiáng)大的圖形和顯示效果,WinForms和WPF 都能完成同一個(gè)需求,只是WinForms在設(shè)計(jì)的時(shí)候比較痛苦一些,并且沒有單獨(dú)把UI分立出來,所以很多時(shí)候都會(huì)和邏輯進(jìn)行耦合;而WPF就不一樣了,它用XAML來進(jìn)行UI的設(shè)計(jì),然后用后臺(tái)C#或VB等語言來進(jìn)行操作,這樣就使職責(zé)進(jìn)行了分立,使每個(gè)部分都發(fā)揮到了最好,同時(shí)也提高了開發(fā)效率。

      對(duì)于長期從事WinForms或者其他沒有從事過ASP.NET等開發(fā)人員, 可能不太習(xí)慣XAML的這種開發(fā)習(xí)慣. 但對(duì)于ASP.NET 的開發(fā)者來說上手就比較容易一些了,因?yàn)樵诤芏喾矫嫠虷TML有很多相似之處. 不過也沒有關(guān)系,只要做了一段時(shí)間以后就會(huì)發(fā)現(xiàn)XAML代碼是那么的有趣,以至于看到它就有一種親切感!

      這個(gè)案例并不是介紹我們?nèi)绾畏艞塛inForm和如何轉(zhuǎn)向于WPF,只是想通過他們的異同進(jìn)行一下簡單的對(duì)比,大家都知道WPF的特長在于UI和邏輯的分離、強(qiáng)大的動(dòng)畫和圖形效果,但是性能卻是一個(gè)擺脫不去的瓶頸。而WinForm正好相反,它在性能上得到了比較好的體現(xiàn),但在顯示強(qiáng)大動(dòng)畫和圖形效果以及一些高交互的效果方面就顯得不能為力了,所以我們?cè)谧鲰?xiàng)目的時(shí)候應(yīng)該有一個(gè)權(quán)衡,尤其是在現(xiàn)在的硬件和軟件基礎(chǔ)上。

8.漫談WPF開發(fā)

     談到WPF的開發(fā),就不能不說到MVVM,一說到MVVM,就會(huì)提及MVC、MVP等概念,那么這樣一關(guān)聯(lián)下來就會(huì)產(chǎn)生很多概念,到最后就很容易變成以概念來闡述概念,最終的結(jié)果可想而知,大家可能會(huì)一頭霧水、不知所云,所以我用“漫談WPF開發(fā)”這個(gè)小標(biāo)題來闡述一下我對(duì)WPF開發(fā)的理解,當(dāng)然只是自己對(duì)這些技術(shù)的總結(jié)和經(jīng)驗(yàn),錯(cuò)誤之處在所難免,也希望大家能夠諒解!

從2007年接觸WPF和Silverlight以來,也做過一些項(xiàng)目了,對(duì)他們也有一些自己的理解,當(dāng)然在開發(fā)這些項(xiàng)目的過程中也在使用其他的一些技術(shù)做項(xiàng)目,比如WinForm、ASP.NETASP.NET MVC一個(gè)項(xiàng)目沒做完就被終止)等等,感覺不論是采用什么技術(shù),最基本的東西都不會(huì)變,比如對(duì)數(shù)據(jù)庫和文件的訪問、對(duì)日志和異常的處理、對(duì)報(bào)表的展現(xiàn)、對(duì)打印的實(shí)現(xiàn)、對(duì)性能的提升、對(duì)用戶的友好等等。

     那么這些項(xiàng)目也為我們積累了不少經(jīng)驗(yàn),有技術(shù)上的也有其他方面的:

  • 為了應(yīng)付項(xiàng)目需求的不斷變化和項(xiàng)目的可擴(kuò)展性,我們也會(huì)引入OO和設(shè)計(jì)模式;
  • 為了解除各模塊和組件的耦合,我們也會(huì)利用IOC的思想解耦;
  • 為了讓邏輯代碼清晰且沒有其他代碼的干擾,我們也會(huì)采用AOP的方式進(jìn)行代碼重組;
  • 為了使項(xiàng)目的開發(fā)速度更快且更方便,我們也會(huì)引入ORM思想來加快項(xiàng)目的開發(fā)速度和可維護(hù)性;
  • 為了更好組織各層開發(fā),隔開耦合,我們也會(huì)采用MVC、MVP、MVVM模式;
  • 為了提升用戶的響應(yīng)速度,我們會(huì)采用AJAX的方式來實(shí)現(xiàn);
  • 為了降低系統(tǒng)的負(fù)載同時(shí)提高用戶的響應(yīng)能力,我們也會(huì)采用MSMQ或者SSB來組織消息隊(duì)列;
  • 為了規(guī)范各系統(tǒng)的接口,提供一個(gè)統(tǒng)一的交互平臺(tái),我們也會(huì)采用SOA;
  • 為了降低服務(wù)器的負(fù)擔(dān)和提高速度,我們也會(huì)自己寫一套緩存;
  • 為了把產(chǎn)品做好,我們也會(huì)不斷優(yōu)化技術(shù);
  • 為了能做好外包項(xiàng)目,我們會(huì)不需要任何高深技術(shù);
  • 為了能得到客戶滿意老板好評(píng),我們也會(huì)學(xué)會(huì)如何交流;

     其實(shí)歸根到底就是要分清關(guān)系,理清思緒,既要處理好與機(jī)器的關(guān)系,也要處理好與人的關(guān)系,只有這樣才能把產(chǎn)品或者項(xiàng)目做成功,我也在不斷學(xué)習(xí)當(dāng)中,所以如果大家有一些這方面的問題和建議,我們也可以互相討論。

     前面不知所云的漫談了一通,那么我們到底該怎么認(rèn)識(shí)WPF項(xiàng)目的開發(fā)呢?我個(gè)人的觀點(diǎn)是和其他技術(shù)一樣,假如這是一個(gè)比較小的而且需求改動(dòng)很小的項(xiàng)目,那么我不建議用一些高深的技術(shù),因?yàn)樗氖邱R上看到效果和時(shí)間上的優(yōu)勢,所以應(yīng)該拋棄我們的技術(shù)思想。當(dāng)遇到一個(gè)比較大型的項(xiàng)目而且需求可能變動(dòng)很大,那我們得慎重考慮系統(tǒng)的構(gòu)架了,因?yàn)楹芏鄷r(shí)候我們都會(huì)發(fā)現(xiàn)我們的系統(tǒng)無法再擴(kuò)展了,這就是一個(gè)很大的“杯具”了。那么作為一個(gè)項(xiàng)目,我們?cè)鯓硬拍茉谑虑白龊媚兀课矣X得有以下幾個(gè)方面:

  • 項(xiàng)目情況把握:首先我們要分析項(xiàng)目的背景、項(xiàng)目的目的、項(xiàng)目的前景、項(xiàng)目的需求、項(xiàng)目的客戶、項(xiàng)目的實(shí)現(xiàn)難度、項(xiàng)目的規(guī)模、項(xiàng)目所使用的技術(shù)、項(xiàng)目的最終效果等因素,只有把握好了這些方面以后,我們才能做到對(duì)項(xiàng)目知根知底且游刃有余。
  • 項(xiàng)目團(tuán)隊(duì)把握:首先分析一下自己的團(tuán)隊(duì)成員組成結(jié)構(gòu),有沒有領(lǐng)域分析人員?有幾個(gè)架構(gòu)師?有沒有Team Leader? 有幾個(gè)senor developer?有幾個(gè)developer?有沒有測試人員? 有沒有項(xiàng)目配置管理員?有沒有QA以及有沒有類似的項(xiàng)目經(jīng)驗(yàn)等。知道這些可以合理安排任務(wù),這正是對(duì)自己團(tuán)隊(duì)的把握。
  • 開發(fā)模式把握:不論你是開發(fā)產(chǎn)品還是做項(xiàng)目,我們都需要采取一種適合的模式,那么什么叫適合呢?這個(gè)沒有準(zhǔn)確的答案,只有根據(jù)具體情況具體分析了,如果需求比較明確且系統(tǒng)較大,那我們就可以用傳統(tǒng)的瀑布模型進(jìn)行開發(fā),只要客戶能接受同時(shí)自己做好各方面的監(jiān)控,應(yīng)該問題不大;如果需求不是很明確且周期很長,我們可以用迭代的方式進(jìn)行開發(fā),這樣客戶也能更加明確自己的需求同時(shí)也能看到自己想要的效果。當(dāng)然如果需求不明確而且有很多不確定因素,我們也可以采用TDD的方式進(jìn)行開發(fā),如果把握得好,這樣慢慢也會(huì)形成一個(gè)比較好的項(xiàng)目。
  • 開發(fā)規(guī)范把握:作為一個(gè)多人開發(fā)的團(tuán)隊(duì),沒有一些規(guī)范是不行的,團(tuán)隊(duì)管理規(guī)范、項(xiàng)目管理規(guī)范、代碼書寫規(guī)范、開發(fā)流程規(guī)范、測試規(guī)范等等,這些都是要在開發(fā)之前定好,否則我們將會(huì)看到項(xiàng)目到處一盤散沙,無從管理。
  • 其他方面規(guī)范:其他方面的規(guī)范就很多了,比如開發(fā)環(huán)境的規(guī)范、測試的規(guī)范、文檔的規(guī)范、部署的規(guī)范等等,這個(gè)可以根據(jù)具體項(xiàng)目進(jìn)行裁剪。

     前面談到了一些項(xiàng)目管理整體把握,總結(jié)就是大道至簡、適可而止!那么我們?nèi)绾尾拍茉诰唧w項(xiàng)目中引用一些其他技術(shù)呢?感覺思緒有點(diǎn)亂了,還是就此打住,等到了講WPF具體項(xiàng)目或者具體技術(shù)的時(shí)候再講,不然就真的一發(fā)不可收拾了。

9.總結(jié)

       這篇主要從WPF的開發(fā)基礎(chǔ)講起,講了一些WPF的開發(fā)工具等內(nèi)容,用一個(gè)例子來對(duì)比了WPF和WinForm的異同之處同時(shí)也對(duì)某些技術(shù)進(jìn)行了漫談,通過這篇文章,我們對(duì)WPF有了一個(gè)基本的了解,所以從下一篇文章開始我們將進(jìn)入WPF的知識(shí)分類講解,最后會(huì)以項(xiàng)目運(yùn)用、優(yōu)化和WPF4結(jié)束整個(gè)系列文章。

       最后圣殿騎士 會(huì)盡心盡力寫好這個(gè)系列,同時(shí)由于是自己對(duì)這些技術(shù)的使用總結(jié)和心得體會(huì),錯(cuò)誤之處在所難免,懷著技術(shù)交流的心態(tài),在博客園51CTO發(fā)表出來,所以希望大家能夠多多指點(diǎn),這樣在使一部分人受益的同時(shí)也能糾正我的錯(cuò)誤觀點(diǎn),以便和各位共同提高,后續(xù)文章敬請(qǐng)關(guān)注!

10.系列進(jìn)度(紅色標(biāo)示已發(fā)布)

· 1. WPF 基礎(chǔ)到企業(yè)應(yīng)用系列1——開篇有益

· 2. WPF 基礎(chǔ)到企業(yè)應(yīng)用系列2——WPF前世今生

· 3. WPF 基礎(chǔ)到企業(yè)應(yīng)用系列3——WPF開發(fā)漫談

· 4.WPF 基礎(chǔ)到企業(yè)應(yīng)用系列4——WPF千年輪回

· 5. 使用面板做布局(幾種布局控件的XAML及CS代碼,綜合布局等)

· 6. 依賴屬性、附加屬性(基本、繼承、元數(shù)據(jù))

· 7. 路由事件、附加事件

· 8. 命令

· 9. WPF控件分類介紹與使用技巧(ContentControl、HeaderedContentControl…… Decorator)

· 10. 尺寸縮放、定位與變換元素

· 11. 資源

· 12. 數(shù)據(jù)綁定(基本、值轉(zhuǎn)換、驗(yàn)證、集合的篩選、排序、分組、主從、數(shù)據(jù)提供者)

· 13. 樣式

· 14. 模板

· 15. 多語言、皮膚和主題

· 16. 2D圖形

· 17. 3D圖形

· 18. 動(dòng)畫(幾種動(dòng)畫的應(yīng)用

· 19. 音頻、視頻、語音

· 20. 文檔、打印、報(bào)表

· 21. 用戶控件和自定義控件

· 22. Win32、Windows Form以及ActiveX之間的互用性

· 23. 構(gòu)建并部署應(yīng)用程序(ClickOnce部署、微軟setup /InstallShield+自動(dòng)更新組件)

· 24. WPF的模式講解及實(shí)例(MVC Demo)

· 25. WPF的模式講解及實(shí)例(MVP Demo)

· 26. WPF的模式講解及實(shí)例(MVVM Demo)

· 27. 性能優(yōu)化(WPF項(xiàng)目的瓶頸)

· 28.一個(gè)完整WPF項(xiàng)目(普通架構(gòu)版)

· 39. 一個(gè)完整WPF項(xiàng)目(MVVM架構(gòu)版)

· 30. WPF 4.0新功能

NET技術(shù)WPF 基礎(chǔ)到企業(yè)應(yīng)用系列3——WPF開發(fā)漫談,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 汶川县| 岳池县| 蒲城县| 屯昌县| 承德市| 潜江市| 湖南省| 察哈| 孝感市| 阳泉市| 竹山县| 巢湖市| 康定县| 容城县| 洮南市| 恩平市| 织金县| 屯留县| 霍州市| 彰化县| 祁连县| 南涧| 博乐市| 南和县| 深水埗区| 新巴尔虎左旗| 宜昌市| 望奎县| 藁城市| 凤山市| 韶山市| 镶黄旗| 永德县| 克山县| 始兴县| 蒲江县| 新竹市| 榆树市| 乾安县| 万荣县| 凌海市|