|
1.開篇前言
首先很高興這個系列能得到大家的關(guān)注和支持,基于對大家負責(zé)和對自己負責(zé)的態(tài)度,我會不斷努力寫好這個系列,分享自己的微薄技術(shù)和經(jīng)驗,希望在幫助別人的同時也不斷提升自己。由于這篇文章稍多,所以讀者花的時間長了一些,也希望大家能夠見諒,這個系列以后會每周發(fā)三到四篇左右(主要是寫一篇差不多要花幾晚上,感覺思維比較發(fā)散),除了講WPF技術(shù)本身之外,也會講一些項目具體開發(fā),所以敬請關(guān)注。在前兩次的文章中我們對WPF有了一個比較全面的認識,那么在本篇文章當(dāng)中,除了講一些理論知識外,我們會從實際的開發(fā)中進行講解,用理論和代碼的形式來詮釋W(xué)PF的簡單開發(fā)過程。
2.本文提綱
· 1.開篇前言
· 2.本文提綱
· 3.WPF開發(fā)基礎(chǔ)
· 4.Expression系列工具簡單介紹
· 5.其他工具介紹
· 6.WPF和WinForm案例
. 7.漫談WPF開發(fā)
· 8.本文總結(jié)
. 9.系列進度
3.WPF開發(fā)基礎(chǔ)
本系列文章默認情況下,開發(fā)環(huán)境為Windows XP+SP3英文版和Visual Studio 2008+SP1英文版。要使用Windows 7 Professional和Visual Studio 2010開發(fā)環(huán)境的時候會附加說明。在搭建好開發(fā)環(huán)境之后,打開VS2008,選擇創(chuàng)建項目(Create Project),出現(xiàn)如下圖所示的選擇項目模板的對話框:
在項目模板選擇對話框中選擇WPF Application,修改項目名稱(Name)(已經(jīng)截圖完畢,所以沒能改名,望見諒),和存儲位置(Location),點擊 確定 (OK)按鈕,便成功創(chuàng)建了一個WPF應(yīng)用程序,模板中文件層次結(jié)構(gòu)如下圖所示(在References里面自動引入了圖一中的PresentationCore、PresentationFramework、WindowsBase三大核心程序集):
圖二
在App.xaml中,指定項目運行時啟動的是窗體:Window1,還可以定義我們需要的系統(tǒng)資源以及引入程序集等,詳細看下圖介紹:
在Window1.xaml中設(shè)計窗體的外觀,首先,我們將窗體的Title更改為:XAMLWithScript,然后設(shè)置窗體的其他屬性和事件 。完成了這些設(shè)置以后,我們就可以對窗體添加內(nèi)容了,本實例對窗體添加了一個Button,然后對Button進行了一些簡單的設(shè)置,詳細如下圖所示:
上圖沒有對一些概念講全,所以下面這幅圖用另外一個窗體對某些概念進行了補充,由于我把很多概念都畫到了圖里面,所以在此就不做過多解釋,詳細如下:
由于每個概念都比較細且多的緣故,所以這里只是對一些基本的概念和元素進行了展示,后續(xù)文章會做一一介紹,也歡迎和大家一起討論!
4.Expression工具的使用
由于自己主攻方向不在這個方面,所以對這些工具也只是會使用而已,會用Expression做一些基本的效果和應(yīng)用,但更多時候都是在visual studio里面手寫代碼,不過有的時候為了配合美工進行代碼集成,也會接觸這些工具。
在 Expression Design 中打開作品文件。(這個作品有可能是你用其他工具創(chuàng)建的,也可以是你用Expression Design 設(shè)計的,但個人認為它還是沒有Photoshop/CorelDraw/Fireworks等工具好用。)
如果要導(dǎo)出切片,請從“工具箱”中選擇“切分”工具,圍繞所要導(dǎo)出的作品區(qū)域繪制一個矩形,然后在“屬性”面板中的“編輯切片”下,設(shè)置切片的屬性(如“Name”)。
單擊“文件”菜單上的“導(dǎo)出”。此時,將顯示“導(dǎo)出”對話框。
在“要導(dǎo)出的項”下,選擇以下選項之一:
- “整個文檔” 導(dǎo)出文檔中的所有作品。
- “選定對象” 只導(dǎo)出那些在美工板上選定的項目。
- “切片” 只導(dǎo)出生成的切片。您可以根據(jù)情況選擇更改所顯示的每個切片的屬性。
接下來設(shè)置“格式”,請選擇以下任一選項:
- “XAML Silverlight 畫布” 導(dǎo)出單個 XAML 文件,其中包含表示為畫布版式面板中的對象的所有作品。您可以在 Expression Blend 3中將此 XAML 文件導(dǎo)入到 Microsoft Silverlight 項目內(nèi),以用作獨立的文檔(啟動的 XAML 文件或以編程方式加載的 XAML 文件),或?qū)ο髲?fù)制并粘貼到另一個 XAML 文檔中。
- “XAML WPF 圖形畫筆” 導(dǎo)出一個資源字典,其中包含表示為圖形畫筆資源的所有作品。您可以在 Expression Blend 3 中將此 XAML 文件導(dǎo)入到 Windows Presentation Foundation (WPF) 項目內(nèi),然后將這些資源應(yīng)用于項目中的對象的畫筆屬性。
- “XAML WPF 畫布” 導(dǎo)出單個 XAML 文件,其中包含表示為畫布版式面板中的對象的所有作品。您可以在 Expression Blend 3 中將此 XAML 文件導(dǎo)入到 Windows Presentation Foundation 項目內(nèi),以用作獨立的文檔(啟動的 XAML 文件或以編程方式加載的 XAML 文件),或?qū)ο髲?fù)制并粘貼到另一個 XAML 文檔中。您還可以在 Expression Blend 3 的“設(shè)計”視圖中打開該文件,右鍵單擊任意一個或多個對象,然后通過選擇“工具”菜單上的選項,利用這些對象來創(chuàng)建按鈕或用戶控件。
在對話框底部的“位置”框旁邊,鍵入導(dǎo)出文件所在的文件夾的路徑(我們這里就保存在D盤)。還可以設(shè)置下列選項:
如果決定導(dǎo)出“整個文檔”或“選定對象”,還需要輸入文件的名稱。如果決定導(dǎo)出“切片”,則可以根據(jù)情況選擇一個版式面板以包含所有對象。
單擊“全部導(dǎo)出”以導(dǎo)出文件。
在 Expression Blend 3 中打開的項目內(nèi),單擊“項目”菜單上的“添加現(xiàn)有項”。
在“添加現(xiàn)有項”對話框中,瀏覽找到所導(dǎo)出的一個或多個 XAML 文件,選擇這些文件,然后單擊“打開”。
5.其他的一些工具
除了上面我們用到的Expression Design、Expression Blend和Visual Studio以外,我們還會用到一些其他的工具,比如一些調(diào)試工具、一些性能優(yōu)化工具和XAML查看工具。
KaXaml是一個輕量級的XAML編輯器,用它之前我們一直都是用XAMLPad,但是用了KaXaml以后才發(fā)現(xiàn)XAMLPad是那么的不好用,并且KaXaml是開源的,在codeplex上進行了發(fā)布,感興趣的朋友也可以下載它的源代碼進行研究。
它主要的功能如下:
1,內(nèi)置諸多代碼片段(模版)
2,內(nèi)置ColorPicker
3,xaml scrubber : 可以幫你清理你的XAML代碼
4,支持語法高亮和智能提示
其他的一些工具和資源,園子里周金根做了一些收集,我在這里也不做一一介紹了,大家可以看一下他的博客,詳細地址:WPF - 資源收集,我覺得整理的非常的不錯。
6.WPF和WinForm案例
介紹
這個例子主要展示同一個需求用WinForm和WPF分別進行實現(xiàn),通過這個例子,我們可以看到兩者之間的區(qū)別和聯(lián)系,同時也可以對我們的項目選型帶來一定的參考作用(原型來自于Josh Smith的一篇文章,個人覺得講得非常不錯,所以對原有例子進行了改造,進而有了這個案例)。
當(dāng)然作為一項新技術(shù),WPF帶來了很多功能,但在使用這些功能的同時也會帶來很多缺點,這是不可避免的,正所謂”有利必有弊“吧!所以我們這個例子并不是講WPF有如何如何的好,怎樣用WPF代替WinForm,而是從兩者實現(xiàn)同一個需求進行簡單的對比。
這個例子是用Visual Studio 2008編寫的,所以大家可以下載下來進行查看.
特別聲明
這個程序并不是要展現(xiàn)聲明優(yōu)秀的架構(gòu)也不是為了宣揚WPF的種種好處,所以沒有采用當(dāng)前比較熱門的MVP、MVVM模式進行開發(fā),同時項目當(dāng)中你可以看到很隨意的代碼,沒有對IOC、AOP以及設(shè)計模式進行應(yīng)用,這也是考慮到具體需求和例子簡單的原因,況且這里也沒有必要,我們在做項目的時候也要時刻注意什么時候用什么開發(fā)框架、開發(fā)模式以及項目整體架構(gòu)。
程序概覽
這個例子非常簡單,需求就是展示三大社區(qū)的基本信息,同時你可以在輸入框?qū)ζ溥M行修改,當(dāng)焦點切換的時候,你就會看到它會自動進行修改,你把鼠標(biāo)放在圖片上面會提示社區(qū)的ID等等。我在這里沒有用復(fù)雜的邏輯和高深的架構(gòu),只是想通過這個例子展示W(wǎng)inForm的WPF的差異和聯(lián)系,所以在程序處理上可能會有很多漏洞,比如沒有對輸入進行驗證,你可以輸入空格和任意字符等。
下面是WinForms版本的截圖:
下面是WPF版本的截圖:
如果你編輯了某個社區(qū)的中文名稱或者英文名稱,然后把焦點移到另外一個地方,這些更改就會通過右上角的全名體現(xiàn)出來,因為他們都是通過綁定到公用字段來實現(xiàn)這些操作的。
整個項目結(jié)構(gòu)如下圖所示:
整個項目一共就三個工程,第一個工程BusinessObjects 是WpfApp和WinFormsApp公用的業(yè)務(wù)類庫,WinFormsApp是用WinForm實現(xiàn)的版本,WpfApp是用WPF實現(xiàn)的版本。那么我們下面就簡單分別進行一些介紹:
公用代碼部分(BusinessObjects)
這兩個應(yīng)用程序都是使用的BusinessObjects作為邏輯類庫,BusinessObjects中的Company對UI所使用的數(shù)據(jù)進行了Mock。所以他們在需求方面都是一樣的,由于比較簡單,所以請看下面代碼:
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也會寫這樣的邏輯類,只是要注意Company 實現(xiàn)了INotifyPropertyChanged 接口,大家看到這個接口只有一個OnPropertyChanged的方法,這個方法就是我們要說的屬性變更通知方法,就是說當(dāng)一個屬性改變了,我們需要做些什么來響應(yīng)這些改變。
- WinForms實現(xiàn)介紹
WinForms版本就包含一個
Form
和一個展示社區(qū)信息的customUserControl
, 這個Form
包含了一個FlowLayoutPanel控件
, 它主要的作用就是用來承載每個社區(qū)的實例. 那么代碼就如下所示:
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)建的一個UserControl,由于每個CompanyControl都要顯示一個Company對象的屬性值,我在這里使用了BindingSource控件來進行綁定,這樣做也是為了和WPF更接近考慮(增強對比性,呵呵)。具體如下截圖:
如上圖所示,我們用了BindingSource來獲取數(shù)據(jù),但有一個屬性除外,那就是Company ID,請看下面代碼:
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);
}
}
}
}
}這里有幾點需要注意.在綁定的時候,我們對PictureFile 字段進行了轉(zhuǎn)換,這個是必須做的. 如果不那樣做, 這個圖片會綁定失敗,因為在綁定的時候它不能自動把
string類型
直接轉(zhuǎn)化為Image類型
.現(xiàn)在我們已經(jīng)把Company綁定到了我們的控件上, 這里我需要給
PictureBox一個
tooltip的效果. 這個tooltip將顯示 CompanyID
, 前綴顯示為 "Company ID:". 現(xiàn)在這個是在代碼里面寫的,沒有在窗體中發(fā)現(xiàn)有WPF ToolTip等類似的工具,不知道大家用到過沒有?總的來說, 這是一個很簡單的例子,我們的大部分功能也是用代碼沒有寫代碼,是通過visual designer進行實現(xiàn)的.然后通過一部分代碼把它銜接起來, 我們看到Windows Forms是一個非??焖俸蛯嵱玫拈_發(fā)平臺.
WPF實現(xiàn)介紹
WPF版本我這里就做得很簡單了,由于開發(fā)WPF程序提供了很多模板和工具,所以我這里基本沒寫什么代碼,全部的代碼都是通過XAML實現(xiàn),并且大部分都是自動生成的,只是我們要根據(jù)項目具體情況做一些修改就行。
這個WPF項目同樣有一個
Window
和一個customUserControl
, 和 WinForms 版本基本一樣. 只是WinForms中用FlowLayoutPanel
來承載EmployeeControl
s 控件, 而WPF 用的是ItemsControl
來承載這個用戶控件.更加可喜的是,WPF通過模板來進行定制,所以我們就不需要像WinForms那樣寫循環(huán)加載控件的代碼,下面就是WPF用XAML實現(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代碼中,這里有幾點需要注意,。Window的DataContext賦予了一個ObjectDataProvider的對象,而ObjectDataProvider又會調(diào)用GetEmployees這個方法。所以一旦把DataContext設(shè)置到Company 對象,并且把ItemsControl的ItemsSource設(shè)置為“{Binding}” 就意味著該控件里面會自動顯示Company 對象的所有數(shù)據(jù)。
這里我們并不需要像WinForm一樣用循環(huán)的方式創(chuàng)建CompanyControl的實例。這是因為ItemsControl中的ItemTemplate屬性設(shè)置為了一個DataTemplate,同時ItemsControl中的ItemsSource綁定到了Company 的對象數(shù)組,那么ItemTemplate就會知道如何創(chuàng)建一個CompanyControl,所以大家看到這里寫的代碼就相對變少了,這也是XAML的一個優(yōu)點之一。
該CompanyControl的后臺CS文件也是空的(除了必須的InitializeComponent),所以它不像的WinForms應(yīng)用程序那么累贅,界面和邏輯緊密的耦合在了一起。下面就是CompanyControl的XAML代碼, 這個代碼相對來說就比較簡單了。
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上的很多元素我們都可以通過拖控件進行實現(xiàn),有個功能需要自己簡單的寫一寫代碼,UI上面有一個功能就是你把鼠標(biāo)放在圖片上的時候會提示Company ID,這個功能通過
ToolTip屬性進行實現(xiàn)的。
ToolTip
屬性是WPF所有元素的基類FrameworkElement的一個屬性,所以我們可以在這些子元素當(dāng)中直接使用。那么大家注意到,這個小功能在WinForm中我們要寫一些代碼,而在WPF就可以直接通過屬性定制,所以在很多方面WPF對這些方面都做了封裝和簡化,也提高了我們的開發(fā)效率。
案例總結(jié)
通過上面的案例,我們主要認識到:如果不需要強大的圖形和顯示效果,WinForms和WPF 都能完成同一個需求,只是WinForms在設(shè)計的時候比較痛苦一些,并且沒有單獨把UI分立出來,所以很多時候都會和邏輯進行耦合;而WPF就不一樣了,它用XAML來進行UI的設(shè)計,然后用后臺C#或VB等語言來進行操作,這樣就使職責(zé)進行了分立,使每個部分都發(fā)揮到了最好,同時也提高了開發(fā)效率。
對于長期從事WinForms或者其他沒有從事過ASP.NET等開發(fā)人員, 可能不太習(xí)慣XAML的這種開發(fā)習(xí)慣. 但對于ASP.NET 的開發(fā)者來說上手就比較容易一些了,因為在很多方面它和HTML有很多相似之處. 不過也沒有關(guān)系,只要做了一段時間以后就會發(fā)現(xiàn)XAML代碼是那么的有趣,以至于看到它就有一種親切感!
這個案例并不是介紹我們?nèi)绾畏艞塛inForm和如何轉(zhuǎn)向于WPF,只是想通過他們的異同進行一下簡單的對比,大家都知道WPF的特長在于UI和邏輯的分離、強大的動畫和圖形效果,但是性能卻是一個擺脫不去的瓶頸。而WinForm正好相反,它在性能上得到了比較好的體現(xiàn),但在顯示強大動畫和圖形效果以及一些高交互的效果方面就顯得不能為力了,所以我們在做項目的時候應(yīng)該有一個權(quán)衡,尤其是在現(xiàn)在的硬件和軟件基礎(chǔ)上。
8.漫談WPF開發(fā)
談到WPF的開發(fā),就不能不說到MVVM,一說到MVVM,就會提及MVC、MVP等概念,那么這樣一關(guān)聯(lián)下來就會產(chǎn)生很多概念,到最后就很容易變成以概念來闡述概念,最終的結(jié)果可想而知,大家可能會一頭霧水、不知所云,所以我用“漫談WPF開發(fā)”這個小標(biāo)題來闡述一下我對WPF開發(fā)的理解,當(dāng)然只是自己對這些技術(shù)的總結(jié)和經(jīng)驗,錯誤之處在所難免,也希望大家能夠諒解!
從2007年接觸WPF和Silverlight以來,也做過一些項目了,對他們也有一些自己的理解,當(dāng)然在開發(fā)這些項目的過程中也在使用其他的一些技術(shù)做項目,比如WinForm、ASP.NET(ASP.NET MVC一個項目沒做完就被終止)等等,感覺不論是采用什么技術(shù),最基本的東西都不會變,比如對數(shù)據(jù)庫和文件的訪問、對日志和異常的處理、對報表的展現(xiàn)、對打印的實現(xiàn)、對性能的提升、對用戶的友好等等。
那么這些項目也為我們積累了不少經(jīng)驗,有技術(shù)上的也有其他方面的:
- 為了應(yīng)付項目需求的不斷變化和項目的可擴展性,我們也會引入OO和設(shè)計模式;
- 為了解除各模塊和組件的耦合,我們也會利用IOC的思想解耦;
- 為了讓邏輯代碼清晰且沒有其他代碼的干擾,我們也會采用AOP的方式進行代碼重組;
- 為了使項目的開發(fā)速度更快且更方便,我們也會引入ORM思想來加快項目的開發(fā)速度和可維護性;
- 為了更好組織各層開發(fā),隔開耦合,我們也會采用MVC、MVP、MVVM模式;
- 為了提升用戶的響應(yīng)速度,我們會采用AJAX的方式來實現(xiàn);
- 為了降低系統(tǒng)的負載同時提高用戶的響應(yīng)能力,我們也會采用MSMQ或者SSB來組織消息隊列;
- 為了規(guī)范各系統(tǒng)的接口,提供一個統(tǒng)一的交互平臺,我們也會采用SOA;
- 為了降低服務(wù)器的負擔(dān)和提高速度,我們也會自己寫一套緩存;
- 為了把產(chǎn)品做好,我們也會不斷優(yōu)化技術(shù);
- 為了能做好外包項目,我們會不需要任何高深技術(shù);
- 為了能得到客戶滿意老板好評,我們也會學(xué)會如何交流;
其實歸根到底就是要分清關(guān)系,理清思緒,既要處理好與機器的關(guān)系,也要處理好與人的關(guān)系,只有這樣才能把產(chǎn)品或者項目做成功,我也在不斷學(xué)習(xí)當(dāng)中,所以如果大家有一些這方面的問題和建議,我們也可以互相討論。
前面不知所云的漫談了一通,那么我們到底該怎么認識WPF項目的開發(fā)呢?我個人的觀點是和其他技術(shù)一樣,假如這是一個比較小的而且需求改動很小的項目,那么我不建議用一些高深的技術(shù),因為它要的是馬上看到效果和時間上的優(yōu)勢,所以應(yīng)該拋棄我們的技術(shù)思想。當(dāng)遇到一個比較大型的項目而且需求可能變動很大,那我們得慎重考慮系統(tǒng)的構(gòu)架了,因為很多時候我們都會發(fā)現(xiàn)我們的系統(tǒng)無法再擴展了,這就是一個很大的“杯具”了。那么作為一個項目,我們怎樣才能在事前做好呢?我覺得有以下幾個方面:
- 項目情況把握:首先我們要分析項目的背景、項目的目的、項目的前景、項目的需求、項目的客戶、項目的實現(xiàn)難度、項目的規(guī)模、項目所使用的技術(shù)、項目的最終效果等因素,只有把握好了這些方面以后,我們才能做到對項目知根知底且游刃有余。
- 項目團隊把握:首先分析一下自己的團隊成員組成結(jié)構(gòu),有沒有領(lǐng)域分析人員?有幾個架構(gòu)師?有沒有Team Leader? 有幾個senor developer?有幾個developer?有沒有測試人員? 有沒有項目配置管理員?有沒有QA以及有沒有類似的項目經(jīng)驗等。知道這些可以合理安排任務(wù),這正是對自己團隊的把握。
- 開發(fā)模式把握:不論你是開發(fā)產(chǎn)品還是做項目,我們都需要采取一種適合的模式,那么什么叫適合呢?這個沒有準(zhǔn)確的答案,只有根據(jù)具體情況具體分析了,如果需求比較明確且系統(tǒng)較大,那我們就可以用傳統(tǒng)的瀑布模型進行開發(fā),只要客戶能接受同時自己做好各方面的監(jiān)控,應(yīng)該問題不大;如果需求不是很明確且周期很長,我們可以用迭代的方式進行開發(fā),這樣客戶也能更加明確自己的需求同時也能看到自己想要的效果。當(dāng)然如果需求不明確而且有很多不確定因素,我們也可以采用TDD的方式進行開發(fā),如果把握得好,這樣慢慢也會形成一個比較好的項目。
- 開發(fā)規(guī)范把握:作為一個多人開發(fā)的團隊,沒有一些規(guī)范是不行的,團隊管理規(guī)范、項目管理規(guī)范、代碼書寫規(guī)范、開發(fā)流程規(guī)范、測試規(guī)范等等,這些都是要在開發(fā)之前定好,否則我們將會看到項目到處一盤散沙,無從管理。
- 其他方面規(guī)范:其他方面的規(guī)范就很多了,比如開發(fā)環(huán)境的規(guī)范、測試的規(guī)范、文檔的規(guī)范、部署的規(guī)范等等,這個可以根據(jù)具體項目進行裁剪。
前面談到了一些項目管理整體把握,總結(jié)就是大道至簡、適可而止!那么我們?nèi)绾尾拍茉诰唧w項目中引用一些其他技術(shù)呢?感覺思緒有點亂了,還是就此打住,等到了講WPF具體項目或者具體技術(shù)的時候再講,不然就真的一發(fā)不可收拾了。
9.總結(jié)
這篇主要從WPF的開發(fā)基礎(chǔ)講起,講了一些WPF的開發(fā)工具等內(nèi)容,用一個例子來對比了WPF和WinForm的異同之處同時也對某些技術(shù)進行了漫談,通過這篇文章,我們對WPF有了一個基本的了解,所以從下一篇文章開始我們將進入WPF的知識分類講解,最后會以項目運用、優(yōu)化和WPF4結(jié)束整個系列文章。
最后圣殿騎士 會盡心盡力寫好這個系列,同時由于是自己對這些技術(shù)的使用總結(jié)和心得體會,錯誤之處在所難免,懷著技術(shù)交流的心態(tài),在博客園和51CTO發(fā)表出來,所以希望大家能夠多多指點,這樣在使一部分人受益的同時也能糾正我的錯誤觀點,以便和各位共同提高,后續(xù)文章敬請關(guān)注!
10.系列進度(紅色標(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)換、驗證、集合的篩選、排序、分組、主從、數(shù)據(jù)提供者)
· 13. 樣式
· 14. 模板
· 15. 多語言、皮膚和主題
· 16. 2D圖形
· 17. 3D圖形
· 18. 動畫(幾種動畫的應(yīng)用)
· 19. 音頻、視頻、語音
· 20. 文檔、打印、報表
· 21. 用戶控件和自定義控件
· 22. Win32、Windows Form以及ActiveX之間的互用性
· 23. 構(gòu)建并部署應(yīng)用程序(ClickOnce部署、微軟setup /InstallShield+自動更新組件)
· 24. WPF的模式講解及實例(MVC Demo)
· 25. WPF的模式講解及實例(MVP Demo)
· 26. WPF的模式講解及實例(MVVM Demo)
· 27. 性能優(yōu)化(WPF項目的瓶頸)
· 28.一個完整WPF項目(普通架構(gòu)版)
· 39. 一個完整WPF項目(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)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。