Pages

20 thg 3, 2010

Những câu đố siêu shock

Phần đáp án ở dưới cuối cùng

H: Con cua đ dài 10 cm chy đua vi con cua xanh dài 15cm.Con nào v đích trước?

TL: Con cua xanh, vì con cua đ đã b luc chín.

H: Li nước gii khát nào cha st và canxi?
TL: Cafe (ca: canxi, Fe: st).

H: T nào trong tiếng Vit có 9 t h?
TL: Chính (chín h).

H: Ti sao khi bn súng người ta li nhm mt mt?
TL: Nhm 2 mt thì s không thy đường đ bn.

H: Cái gì người mua biết, người bán biết, người xài không bao gi biết?
TL: Quan tài.

H: Ai cũng biết đnh núi Everest cao nht thế gii, vy trước khi đnh Everest được khám phá, đnh núi nào cao nht thế gii?
TL: Everest.

H: Tìm đim sai trong câu: "dưới ánh nng sương long lanh triu cành hng khoe sc thm"
TL: Khoe sc khoé!

H: T gì mà 100% dân Vit Nam đu phát âm sai?
TL: T "sai".

H: Cái gì tay trái cm được còn tay phi cm không được?
TL: Tay phi.

H: Tìm đim sai trong câu: "dưới ánh nng sương long lanh triu cành hng khoe sc thm"
TL: Khoe sc khoé!

H: Khi Beckham thc hin qu đá pht đn, anh ta s sút vào đâu?
TL: Trái banh.

H: S thú b cháy, con gì chy ra đu tiên?
TL: Con người.

H: Cơ quan quan trng nht ca ph n là gì ?
TL: Hi Liên Hip Ph N.

H: Có 1 con trâu. Đu nó thì hướng v hướng mt tri mc, nó quay trái 2 vòng sau đó quay ngược li sau đó li quay phi hay vòng hi cái đuôi ca nó ch hướng nào?
TL: Ch xung đt.

H: Trong 1 cuc thi chy, nếu bn vượt qua người th 2 bn s đng th my?
TL: Th 2.

H: Con gì không gáy ò ó o mà người ta vn gi là gà?
TL: Gà con và gà mái.

H: Con gì đu dê mình c ?
TL: Con dc.

H: Môn gì càng thng càng thua ?
TL: Môn đua xe đp.

H: Núi nào mà b cht ra tng khúc?
TL: Thái Sơn.

H: Cái gì mà đi thì nm, đng cũng nm, nhưng nm li đng?
TL: Bàn chân.

H: Có 1 bà kia không biết bơi, xung nước là b chết. Mt hôm bà đi tàu, bng nhiên tàu chìm, nhưng bà ko chết.Ti sao (ko ai cu hết)?
TL: Bà y đi tàu ngm.

H: Con ma xanh đp 1 phát chết, con ma đ đp 2 phát thì chết. Làm sao ch vi 2 ln đp mà chết c 2 con?
TL: Đp con ma xanh trước là 1, con ma đ thy thế s quá, mt mày tái mét (chuyn sang xanh).Đp con ma xanh mi này na là đ 2.

H: 2 con vt đi trước 2 con vt, 2 con vt đi sau 2 con vt, 2 con vt đi gia 2 con vt. Hi có my con vt?
TL: 4.

H: Mt k giết người b kết án t hình. Hn ta phi chn mt trong ba căn phòng: phòng th nht la cháy d di, phòng th hai đy nhng k ám sát đang giương súng, và phòng th ba đy sư t nhn đói trong ba năm. Phòng nào an toàn nht cho hn?
TL: Phòng 3 vì sư t chết hết ri

H: Nếu ch có mt que diêm, trong mt ngày mùa đông giá rét, bn bước vào căn phòng có mt cây đèn, mt bếp du, và mt bếp ci, bn thp gì trước tiên?
TL: Que diêm.

Sau khi giải được những câu đố này thì bạn hãy tô đen khoảng trắng dưới câu hỏi để thấy đáp án. Nếu lần đầu tiên đọc những câu này mà trả lời đúng 100% thì đúng là thiên tài. heheheee

19 thg 3, 2010

SubSonic Framework: Kiến trúc thế hệ mới trên .NET

Đối với bất kỳ dự án nào, việc xây dựng Data Access Layer (DAL) luôn là công việc tốn nhiều công sức và thời gian nhất, nhất là khi phải làm việc với cơ sở dữ liệu lớn. Hơn nữa việc tự xây dựng DAL có thể không được an toàn hoặc tiềm tàng các lỗ hổng bảo mật nếu nhóm phát triển thiếu kinh nghiệm. Chính vì lý do đó mà người ta đưa ra nhiều framework mạnh như NHibernate, LINQ, SubSonic... giúp tự động hóa các công việc viết mã, xây dựng một loạt các Business Object nối từ database ra đến giao diện (UI). Trong số các framework này, SubSonic nổi lên với tiềm năng sẽ trở thành một framework được ưa chuộng do dễ sử dụng.

SubSonic là gì?

SubSonic là một framework với rất nhiều công cụ giúp xây dựng kiến trúc dự án (đặc biệt các dự án web) một cách nhanh chóng, trong đó ý tưởng chính là tự động hóa công việc viết mã cho DAL.

Đặc điểm

• SubSonic giảm thời gian viết mã cho người phát triển.

• SubSonic gắn liền với "tự động hóa", được cài đặt để cập nhật thay đổi thiết kế của CSDL và tự động đồng bộ, cập nhật mã cho DAL, để người phát triển có thể tập trung vào những công việc sáng tạo khác.

• SubSonic sử dụng mô hình Entity làm nền tảng và không hỗ trợ DataSet.

• SubSonic thiết kế DAL dựa trên các mô hình nổi tiếng: "Provider Pattern" và "Active Record Pattern". Active Record là một pattern đặc biệt của Entity với 3 trạng thái đặc trưng: IsLoaded, IsNew và IsDirty. Ngoài ra, giữa các ActiveRecord có quan hệ liên kết với nhau giống như liên kết các bảng trong CSDL.

• Dựa vào ORM (Object Relational Mapping), SubSonic xây dựng ánh xạ giữa các Table/View/Stored Procedures với các đối tượng tạo nên DAL. Ngoài ra, SubSonic được thiết kế tương thích với nhiều hệ CSDL (MS SQL, MySQL, Oracle...).

Trước đây khi xây dựng DAL, chúng ta thường sử dụng DataSet hoặc Entity để trao đổi dữ liệu giữa các tầng với nhau. Các Entity hoặc DataSet là kết quả của phép ánh xạ các bảng CSDL (Table) với các đối tượng. Tuy nhiên việc xây dựng các ánh xạ như vậy thường rất vất vả cho các lập trình viên. Thời kỳ đó các công cụ thương mại như CodeSmidth... ra đời giúp các lập trình viên nhanh chóng tạo ra các đối tượng (Entity, DataSet...) từ các bảng. Tuy nhiên hạn chế của CodeSmidth là lập trình viên phải có kiến thức về ngôn ngữ script để định nghĩa ra các Template trước khi tạo ra Entity, DataSet hay một "Object Pattern" nào đó.

Kiến trúc

• Trung tâm của SubSonic framework là DAL Builder, có nhiệm vụ tạo ra một loạt các đối tượng (Model, Controller), nhờ đó giảm tối đa công sức viết mã. Tất cả các đối tượng được tạo ra bởi SubSonic đều được thiết kế theo kỹ thuật "strongly-typed" sao cho dữ liệu được quản lý an toàn và hiệu quả.

• Sau khi đã có các đối tượng được tạo ra từ DAL Builder, SubSonic hỗ trợ một Query Engine cho phép truy vấn dữ liệu động mà không cần phải viết mã truy vấn, nhờ đó giảm được thời gian cho những công việc lặp lại, nhàm chán (đặc biệt là đối với các CSDL lớn) để người phát triển có thể tập trung nhiều hơn vào các công việc sáng tạo khác.

• Bao quanh SubSonic là các tầng tiện ích, thư viện API và ngày càng được hoàn chỉnh với nhiều Control mới. Đáng kể nhất là "giàn giáo" (Scaffold) giúp thiết kế nhanh các trang Admin (xem chi tiết "Scaffold" ở phần cuối).

Cấu hình

Trước hết, chúng ta hãy mở Web.config (hoặc App.config cho dự án không phải web), thiết lập cấu hình cho SubSonic như sau:



Tiếp theo, thiết lập kết nối cơ sở dữ liệu:



Sau 2 bước trên, chúng ta sẽ định nghĩa các Provider, mỗi Provider được kết nối với một cơ sở dữ liệu:


SubsonicService >


Trên đây là thông tin cơ bản nhất để bắt đầu làm việc với SubSonic. Thông tin này được sử dụng cho hai trường hợp:

• Kích hoạt SubSonic để sinh mã cho các object, scaffold... tại thời điểm biên dịch.

• Thực thi các tương tác với CSDL tại thời điểm chạy chương trình.

Query Engine

SubSonic cung cấp dịch vụ Query Engine cho phép tương tác dữ liệu thông qua một loạt các đối tượng và phương thức có sẵn.

Như đã nói ở trên, mỗi Provider thiết lập kết nối với một CSDL. Khi đang thực thi chương trình có thể chuyển đổi dễ dàng các Provider này. Đoạn mã thí dụ dưới đây sẽ chỉ ra cách thức SubSonic làm việc với CSDL như thế nào:

SubSonic.Query query1 = new SubSonic.Query("Products", "CommerceDataProvider"); //Tham số đầu tiên là tên bảng, tham số thứ hai là tên Provider sẽ được kết nối với SubSonic thông qua khai báo trong web.config.

query1.Schema = SubSonic.Query.BuildTableSchema("Products");
query1.WHERE("ProductName", SubSonic.Comparison.Equals, "BlackBerry");

DataSet ds = query1.ExecuteDataSet();
string debugInfo = query1.Inspect(); //Trả về HTML markups bao gồm các thông tin như thời gian thực thi truy vấn, kết quả truy vấn... Thông tin này rất có ích khi cần debug chương trình
Response.Write(debugInfo); //Cuối cùng, ghi thông tin cần debug ra màn hình
Để hiểu thêm về cách thức Query Engine hoạt động, bạn có thể bắt đầu với dự án đơn giản qua video trực tuyến tại địa chỉ: http://www.wekeroad.com/ss_setup2.html

Active Record Pattern

SubSonic sinh mã theo mô hình Active Record Pattern, tức là mỗi một Table hoặc View sẽ được ánh xạ vào một đối tượng (Active Record), đối tượng này tương tác với Table/View/SP thông qua các hàm chuẩn Load(), Save()... Xem thí dụ sau:

product = new Product()
product.Name = "Your product name"
product.Price = 123.45
product.Save()

Các đối tượng này còn đựơc gọi là "Wrapper Object".

Tất cả các đối tượng sinh ra từ SubSonic đều kế thừa ActiveRecord hoặc ActiveList (đối với các đối tượng dạng danh sách - Collection). SubSonic đưa vào ActiveRecord tất cả các phương thức chuẩn, bao gồm: Save(), Delete(), Destroy(), FetchAll(), FetchByParameter()...

SubSonic sinh mã như thế nào?

Có rất nhiều cách sinh mã trong SubSonic, bạn có thể sử dụng một trong các cách sau:

• Command-line: Trực tiếp trên MS Dos hoặc chạy tệp batch. Một cách khác là mở External Tools trong IDE và đặt đường dẫn đến SubSonic, sau đó kéo vào Toolbar như dưới đây:

Trên toolbar có thể thấy 4 chức năng được bổ sung, gồm chức năng tạo DAL, chức năng thiết kế Scaffold (xem chi tiết "Scaffold" ở phần cuối bài viết) và hai chức năng liên quan đến Database Migration hay DB Versioning (quản lý phiên bản cơ sở dữ liệu).

• Macro: Tích hợp SubSonic với Visual Studio 2005. Với macro, bạn có thể tạo ra DAL chỉ với một lần click chuột.

• SubSonic Add-in, SubSonic Custom Tool: Có thể tích hợp SubSonic vào Visual Studio 2005 như một Add-in hoặc Custom Tool.

• SubStage: Đây là một chương trình khá mạnh có thể tạo ra tất cả những gì bạn muốn, bao gồm cả thông tin về Web.config và mã chương trình như Object Wrapper (Model, Controller), Scaffold... Bạn sẽ không phải làm gì cả ngoại trừ "copy/paste" mã vừa tạo ra vào dự án của bạn (xem thêm phần SubStage ở phần cuối)

Partial Class

SubSonic được xây dựng trên .NET 2.0 trở đi, do đó sẽ không phải lo lắng liệu có thể viết đè lên các đối tượng được SubSonic tạo ra, vì .NET phiên bản 2.0 trở đi hỗ trợ việc xây dựng các đối tượng mở rộng (Partial). Mỗi "Wrapper Object" sẽ có 2 phần, một phần do SubSonic tạo ra, phần còn lại (partial class) là nơi bổ sung các đoạn mã mới mà không ảnh hưởng đến hoạt động của toàn bộ hệ thống.

Audit Field

Trong các thiết kế CSDL ngày nay, các trường Audit Field có mặt gần như khắp mọi nơi. Audit Field làm tăng dữ liệu dư thừa nhưng hiệu quả đem lại thì không thể không tính đến, đó là đẩy mạnh tốc độ xử lý của ứng dụng và đảm bảo an toàn dữ liệu. Có thể nhận thấy rõ nhất điều này khi sử dụng Audit Field để xử lý các vấn đề xung đột khi có nhiều người cập nhật cùng một dữ liệu.

SubSonic tận dụng khả năng đem lại của Audit Field và đưa ra thiết kế chuẩn cho các trường Audit Field như sau:

public class ReservedColumnName
{
public const string CREATED_BY = "CreatedBy";
public const string CREATED_ON = "CreatedOn";
public const string DELETED = "Deleted";
public const string IS_ACTIVE = "IsActive";
public const string IS_DELETED = "IsDeleted";
public const string MODIFIED_BY = "ModifiedBy";
public const string MODIFIED_ON = "ModifiedOn";
}

SubSonic khuyến nghị các bảng CSDL nên được thiết kế với các trường dành riêng này. Vậy SubSonic xử lý các trường Audit Field như thế nào?

Lấy thí dụ về trường "IsDeleted", khi bạn gọi lệnh xóa một bản ghi (phương thức Delete() của ActiveRecord), SubSonic sẽ không xóa bản ghi hoàn toàn ra khỏi database, mà sẽ đánh dấu bản ghi này bằng cách gán giá trị IsDeleted = True. Nếu muốn xóahoàn toàn bản ghi này ra khỏi database, phương thức Destroy() sẽ thực hiện điều đó.

So sánh SubSonic với NHibernate

NHibernate không tự sinh ra mã mà cần đến các chương trình bên ngoài (thí dụ CodeSmidth) định nghĩa template cho NHibernate trước khi sinh mã. Ngược lại SubSonic tự động hoá hoàn toàn và có thể cho phép sửa đổi template theo ý muốn. Hơn nữa SubSonic là một dự án nguồn mở hoàn toàn miễn phí và Microsoft dự kiến sẽ tích hợp SubSonic như một thành phần trong bộ công cụ .NET Studio.

So với các framework khác như Hibernate, LINQ... thì SubSonic dễ cấu hình hơn và có kiến trúc đơn giản, ổn định. Chính vì lý do đó mà SubSonic được xem như "framework nhẹ”.

SubSonic + ASP.MVC: Sự kết hợp kiến trúc trên nền .NET

SubSonic dựa trên MVC và MVC vận dụng SubSonic để xây dựng tầng DAL. Đó là một mối quan hệ khăng khít giữa MVC và SubSonic.

Model: Theo định nghĩa của MVC thì Model sẽ quản lý thông tin và thông báo cho các Observer khi thông tin đó thay đổi. Lợi dụng đặc điểm này, SubSonic xây dựng các Model trong đó thiết lập ánh xạ với các Table/View. Các thuộc tính cơ bản của ActiveRecord là: IsLoaded, IsNew, IsDirty sẽ nói lên trạng thái của thông tin được thay đổi ra sao.

Controller: Trong mô hình MVC, Controller chịu trách nhiệm kết nối các tương tác người dùng với phản hồi của ứng dụng. Controller nhận đầu vào từ View và điều khiển Model để thực hiện các tác vụ tương ứng. Controller kết nối các Model khác nhau và quản lý nguồn dữ liệu của các Model đó (do đó còn gọi là Object Data Source Controller). Cũng như Model, với mỗi Table/View, SubSonic tự động tạo ra Controller tương ứng. Ngoài ra, Controller có thể được mở rộng (partial class) với các "business rule" đặc thù cho từng module.

Như vậy, đối với mỗi một Table/View, sẽ có 3 đối tượng được tự động tạo ra bởi SubSonic: Hai đối tượng Model (một kế thừa ActiveRecord và một kế thừa ActiveList) và một đối tượng Controller.

ASP.NET MVC Web Application Template

Microsoft cung cấp hẳn một template dành riêng cho các dự án theo kiến trúc MVC (có thể vào website của Microsoft để tải về MVC Template). Lưu ý, bất kỳ dự án nào không phải MVC vẫn có thể tích hợp được SubSonic. Tuy nhiên việc xây dựng dự án dựa trên MVC Template có thuận lợi là bạn không phải quan tâm đến toàn bộ kiến trúc của dự án, việc duy nhất bạn phải làm là khởi động SubSonic.
Các bạn có thể tải về video hướng dẫn chi tiết cách thức tích hợp SubSonic với MVC Template tại địa chỉ: http://silverlight.services.live.com/58326/Makai%20Intro/video.wmv

Scaffold: Giàn giáo trong xây dựng phần mềm

Giả sử bạn có tới 50 bảng CSDL và các lập trình viên (LTV), kiểm tra viên (KTV) thường xuyên thao tác với dữ liệu các bảng này để kiểm tra công việc của họ. Tuy nhiên bạn không muốn LTV và KTV thao tác dữ liệu trực tiếp trong CSDL vì nhiều rủi ro. Phương pháp an toàn nhất là dựng lên các giao diện "tạm" với đầy đủ các chức năng CRUD (Create, Read, Update, Delete) giống như một trang Admin để bất cứ ai cũng có thể thay đổi được. Tuy nhiên việc xây dựng 50 trang tạm như thế làm tốn thời gian và công sức. Thuật ngữ "Scaffold" ra đời để tái hiện các trang tạm đó giống như các "giàn giáo" trong ngành xây dựng, giúp các LTV, KTV đẩy mạnh tiến độ dự án. Và khi dự án kết thúc, các giàn giáo đó sẽ được gỡ bỏ và rất có thể, một số trong số đó được giữ lại hoặc thậm chí nâng cấp thành các trang Admin.

Một đặc điểm dễ thấy của Scaffold là, không giống như các trang tương tác trực tiếp với khách hàng, các trang Admin không có yêu cầu quá cao về giao diện vì chỉ hoạt động chủ yếu ở "hậu trường", do đó thiết kế cũng rất đơn giản, sơ sài. Ban đầu Scaffold chỉ được sử dụng cho nội bộ nhóm các LTV và KTV trong suốt quá trình phát triển dự án, về sau các phiên bản mới của các framework đều ra sức phát triển công cụ đi kèm để nâng cấp Scaffold thành các trang Admin hoàn thiện hơn về mặt giao diện lẫn chức năng để bất cứ người dùng nào (có quyền) cũng đều có thể truy cập được như người quản trị hệ thống, những người quản lý...

Hiện nay các framework lớn như Ruby-On-Rails, MonoRail... đều cung cấp Scaffold giúp đẩy mạnh xây dựng các trang Admin. Đặc biệt với Scaffold trong SubSonic, bạn không cần phải viết một dòng mã nào.

Ngoài các chức năng cơ bản CRUD, SubSonic còn trang bị cho Scaffold các control tiện dụng như: GridView, Paging, Calendar, DropDown...

Scaffold trong SubSonic rất đa đạng và được phân loại như sau:

• QuickTable: Hiển thị toàn bộ dữ liệu của một bảng trên GridView, không có đầy đủ CRUD. Đây là control đơn giản nhất của SubSonic.

• Các User Control thành phần bao gồm: DropDown, CalendarControl, ManyManyList, RadioButtons.

• Scaffold: Có đầy đủ CRUD và chứa tất cả các control thành phần của SubSonic.

Bạn có thể kéo thả Scaffold vào giao diện tùy theo mục đích sử dụng, thí dụ nếu muốn tương tác với dữ liệu của bảng Orders trên GridView thì có thể viết trên ASP.NET như sau:Control này sẽ vẽ một bảng chứa toàn bộ dữ liệu của Orders và thiết lập trang soạn thảo (Editor) cho các chức năng Create, Update, Delete.

Chú ý: Đối với các bảng nối (Associate Table), SubSonic bổ sung control có tên là "Many-To-Many" vào Scaffold, nhờ đó người dùng có thể nhập dữ liệu vào bảng nối một cách dễ dàng. Thí dụ bảng OrderDetails trong CSDL của Northwind sẽ là bảng nối của hai bảng Order và Product.

SubStage

SubSonic có thể tự động thiết kế toàn bộ các trang Admin, có nghĩa là bạn không phải mất một giây nào để làm điều đó. SubSonic cung cấp một chương trình quản lý với giao diện trực quan có tên là SubStage với hai chức năng chính: quản lý thông tin cấu hình và sinh mã cho DAL (bao gồm cả mã cho Scaffold). Tất cả những gì bạn phải làm chỉ là chọn Database, Provider và Table mà bạn sẽ tương tác.

Có thể tải về video hướng dẫn sử dụng SubStage tại địa chỉ: http://subsonicproject.com/2-1-pakala/using-substage/

Trước khi bước sang phần tiếp theo, hãy cùng tổng kết lại những gì SubSonic có thể tạo ra:

• DAL:
- "Active Record Wrapper" cho Table, View và SP
- Strongly Typed Collection classes
- Object Data Source Controllers

• Source code (SubSonic config, Scaffold...)

Thư viện hàm tiện ích

Bên cạnh Scaffold và User Control, SubSonic còn cung cấp một thư viện khá lớn bao gồm các hàm xử lý ngày-tháng nâng cao, các hàm xử lý file nâng cao, các hàm xử lý string/number/validation, các hàm thao tác web (thí dụ như mở/đọc trang web, thực hiện DNS Lookup...)

Ứng dụng của SubSonic

SubSonic ngày càng được sử dụng rộng rãi và được xem là framework tốt nhất để xây dựng DAL. Có thể kể đến một số phần mềm nguồn mở cũng như nguồn đóng như:

• DashCommerce (www.dashcommerce.com)

• Commerce for Umbraco: http://www.codeplex.com/commerce4umbraco

• Club Starter Kit: http://www.codeplex.com/ClubStarterKit

• DotNetKick: http://www.dotnetkicks.com

• FranchiseBlast: http://www.lavablast.com/en/lb_franchiseblast.aspx

Các nhà phát triển DotNetNuke (hay DNN, framework nổi tiếng cho Portal trên nền .NET) cũng đang tích hợp SubSonic vào một số module và có thể trong tương lai gần sẽ tích hợp SubSonic vào toàn bộ DNN.

Đới với những người mới bắt đầu tìm hiểu SubSonic, có thể tham khảo một trong hai gói ứng dụng đơn giản nhất:

• "SubSonic Starter Site", tải về tại địa chỉ:

http://www.codeplex.com/subsonic/Release/ProjectReleases.aspx?ReleaseId=5177

• "Blog Engine":

http://dotnetslackers.com/articles/aspnet/UsingSubSonicToCreateASimpleBogEngine.aspx

Xin giới thiệu thêm một video trình bày về "SubSonic Starter Site" tại địa chỉ:

http://www.wekeroad.com/starterintro.htm

Theo PCWorld Việt Nam

15 thg 3, 2010

Update lên phiên bản Windows XP SP3 chính thức khi windows không có bản quyền

Bạn muốn update windows lên phiên bản SP3 khi windows của bạn là "hàng free"?
đơn giản, trước tiên bạn down cái này về xả nén, click OK để "đăng ký bản quyền" cho windows của bạn, bạn vào Start, Run, gõ Regedit, nhấn enter rồi tìm đến khóa HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\Cu rrentVersion\WPAEvents , nhấn chuột phải vào OOBETimer, rồi click vào Modify, tiếp đến hãy thay đổi khóa: 71 thành 72. Bạn download bản update SP3 chính thức thức dùng winrar xả nén rồi chạy file update.exe (Đườngdẫn:D:\xpsp3_5512.080413-2113_usa_x86fre_spcd\WINDOWSXP-KB936929-SP3-X86-ENU\i386\update.exe) Sau khi kết thúc cài đặt, bạn khởi động lại máy theo yêu cầu của hệ điều hành để hoàn tất quá trình Update windows của bạn lên phiên bản SP3.


Code file windowslicence.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WPAEvents]
"OOBETimer"=hex:ff,d5,71,d6,8b,6a,8d,6f,d5,33,93,fd
"LastWPAEventLogged"=hex:d5,07,05,00,06,00,07,00,0f,00,38,00,24,00,fd,02

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"CurrentBuild"="1.511.1 () (Obsolete data - do not use)"
"InstallDate"=dword:427cdd95
"ProductId"="69831-640-1780577-45389"
"DigitalProductId"=hex:a4,00,00,00,03,00,00,00,36,39,38,33,31,2d,36,34,30,2d,\
31,37,38,30,35,37,37,2d,34,35,33,38,39,00,5a,00,00,00,41,32,32,2d,30,30,30,\
30,31,00,00,00,00,00,00,00,00,0d,04,89,b2,15,1b,c4,ee,62,4f,e6,64,6f,01,00,\
00,00,00,00,27,ed,85,43,a2,20,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,31,34,35,30,34,00,00,00,00,00,00,00,ce,0e,\
00,00,12,42,15,a0,00,08,00,00,87,01,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,94,a2,b3,ac
"LicenseInfo"=hex:9e,bf,09,d0,3a,76,a5,27,bb,f2,da,88,58,ce,58,e9,05,6b,0b,82,\
c3,74,ab,42,0d,fb,ee,c3,ea,57,d0,9d,67,a5,3d,6e,42,0d,60,c0,1a,70,24,46,16,\
0a,0a,ce,0d,b8,27,4a,46,53,f3,17

13 thg 3, 2010

WPF tutorial: HOW TO style and change WPF ListBox (ComboBox, TreeView…) highlighting colors


How to change color of selected (highlighted) item in your WPF ListBox (or ComboBox, ListView or TreeView) in Expression Blend? WPF allows you to do this and much more by using Styles and Templates. I this tutorial I will show you how to achieve that. (added source code)

Often, you need to restyle default style of your WPF controls. In this tutorial, I will show you how to change highlighting color of your WPF List Box in Expression Blend. That way you can customize your controls and provide better user experience.

Basically we will go from this:

…to something like this:

ListBox (and everything I will show you in this tutorial is applicable to ComboBox, TreeView nad ListView WPF controls) is common control used widely across all different kind of applications. Customization is, however, rarely seen and I hope to show that changing something like highlight color of your ListBox control is very simple.

1. Start your Expression Blend and draw ListBox control on workspace.

2. Right click on your ListBox in Objects and Timeline pane and click on Add ListBoxItem. Repeat that procedure several times – just enough to populate your ListBox with 5 or 6 items.

3. Press F5 to start your project. Click on some item in your list box and it should look something like this:

That is the default highlight for selected item in your ListBox control. And we are going to change it right now.

4. Close your window and return to Blend.

5. Select your ListBox and from Object menu choose Edit Other Styles then Edit ItemContainerStyle and finally Edit Copy…

6. Create Style Resource dialog shows. Enter name for your style – for example –NewHighlightStyle and select Define in Application (this basically just tells if this style will be able to all objects in application or this document only or in resource dictionary).

Click on OK when you are done.

7. Right-click on Style in Objects and Timeline pane and then select Edit Control Parts (Template) and Edit Template after that.

8. Now we are ready for some serious job. Take a look at Trigger section inInteraction pane. You can notice that there are several defined triggers and that they are connected with some specific actions.

Click on IsSelected = True and you will notice that your ListBoxItem changes its color to blue – color that it usually has when it is highlighted.

8. Select the border control called Bd in your Objects and Timeline pane.

9. Take a look at Properites pane.

You can see under Brushes section that Background is set to HighlightBrushKey - which is one of predefined resources.

10. Click on Advanced property options (little green square) and after that click onReset.

You will now notice that your ListBoxItem looks transparent.

11. Now we will add some colors and make that ListBoxItem look nicer. Click onGradient Brush, add few stops and create whatever background you want. (You can tell I am from Croatia just by looking on my choice of colors) :)

12. If you go now again and press F5 to start your project and click on ListBoxItem you should see that it now sports highlight style that you’ve just defined.

In this way you can easily change look of de facto all WPF controls without worrying if you will change default behaviors.

In future tutorials on UXPassion.com I will go and show you numerous other possibilities for creating and customizing controls.

Please note that this process can be used for styling your Silverlight controls as well.
If you have some questions, leave them in comments, I’d be glad to try to help you out.

Powered By Blogger