Bài viết này miêu tả đặc tính của XAML và chứng minh chúng ta có thể dùng XAML để xây dựng ứng dụng WPF.
    Bài viết chứa các phần sau :
 + XAML là gì
 + Giới thiệu tóm tắt cú pháp của XAML
 + Case và khoảng trắng trong XAML
 + Markup Extensions
 + Type Converter
 + RootElement và Namespace
 + Tiền tố tùy chỉnh và các kiểu tùy chỉnh
 + Event và Code-Behind
 + Tên của Element
 + Thêm thuộc tính và thêm sự kiện
 + Kiểu cơ sở
 + Bảo mật 
 + Tải XAML từ code

1.XAML là gì ?
- XAML là một ngôn ngữ đánh dấu khai báo như XML , nó được sử dụng trong các mẫu lập trình của .NET để đơn giản hóa việc tạo ra giao diện người dùng.
- Bạn có thể tạo các yếu tố giao diện người dùng cho ứng dung , sau đó tách riêng phần logic runtime trong code behind của file .cs, để tham gia vào các khai báo XAML thông qua partial class.XAML đại diện cho tập hợp các đối tượng được định nghĩa đặc biệt từ assembly.
- Từ đó XAML tách biệt được 2 phần thiết kế giao diện và lập trình logic thông qua tool hỗ trợ đánh dấu mà ít ngôn ngữ đánh dấu nào làm được.
- Khi được hiển thị ở định dạng text , file XAML là các file XML có đuôi mở rộng là .xaml , các tập tin xaml này có thể được mã hóa giống xml ví dụ như mã hóa UTF-8 là điển hình.
- Ví dụ sau đây cho bạn thấy được cách tạo 1 nút như 1 phần của giao diện người dùng nhưng nó ko phải đầy đủ để gọi là giao diện



2.Tóm tắt cú pháp của XAML
- Cách phần này diễn tả các cú pháp cơ bản của XAML , đưa ra một số ví dụ đánh dấu ngắn , để nắm chi tiết hơn bạn có thể đọc qua bài sau "Cú pháp XAML"
- Những phần tiếp theo sau đây sẽ là những phần căn bản cho bạn , nếu bạn đã biết qua XML thì nó có cách khai báo đánh dấu tương đương đồng thời có những đặc tính riêng.
    Object Element & Property Syntax
- Một Object Element thường khai báo là phiên bản (instantce) của 1 kiểu (1 class) . Kiểu này được định nghĩa trong assembly để cung cấp 1 kiểu (1 class) tương đương với các Object Element trong XAML.
                                    <[Tên Object Element] [Tên Thuộc tính = "Giá trị"] />



- Ở trên chỉ rõ 2 Object Element <Button/> nằm trong parent là <StackPanel/>. mỗi element sẽ ánh xạ đến class tương ứng được định nghĩa trong Assemply.Lúc bạn chọn "<" bạn đang chỉ định XAML tạo 1 phiên bản của class.Mỗi phiên bản của element class được tạo sẽ gọi đến contructor mặc định nằm trong class đó trong quá trình phân tích và tải XAML.
    Property Element Syntax
- Đối với vài thuộc tính của Object Element , khai báo cú pháp Property Syntax là không thể bởi vì giá trị của thuộc tính không nằm trong phạm vi "chuỗi giá trị" thay vào đó ta phải khai báo Property Element Syntax


    Collection Syntax
- XAML là ngôn ngữ tối ưu hóa khả năng đánh dấu để các nhà phát triển dễ đọc hơn.Một trong các điểm tối ưu hóa là nếu 1 thuộc tính đặc biệt co kiểu là Collection.Trong đó các Item của Collection bạn có thể đánh dấu như child element vào trong giá trị của thuộc tính đặc biệt và trở thành 1 phần của collection.
- Trong trường này 1 tập các child object element như là 1 giá trị của được gán cho thuộc tính kiểu collection.



    Thuộc tính Content Property
- XAML là ngôn ngữ có đặc tính đặc biệt , theo đó 1 class có thể ký hiệu chính xác một thuộc tính của nó là XAML content property (nghĩa là child element của object element được dùng để gán giá trị cho thuộc tính content) 
- Ví dụ Border có Content Property của thuộc tính Child.Sau đó ta khai báo 2 Border với mục đích giống nhau.
+ Border thứ nhất tận dụng cú pháp đơn giản content property mà bỏ qua Border.Child (Property Element Syntax)
+ Border thứ 2 cho thấy rõ Border.Child



    Text Content
- Một số ít các element có khả năng chứa text như là content của nó , để có được khả năng này cho các element ta phải khai báo đúng ,Class của Object Element tương ứng phải có khai báo content property có kiểu string hoặc object
                                                                <Button>Hello</Button>

    Thuộc tính Content Property và Collection Syntax Combined


- Ở code trên mỗi Button là 1 child element của StackPanel, đây là cách đánh dấu hợp lý và trực quan bỏ khai báo 2 tag vì 2 lý do khác nhau :
+ Bỏ qua tag StackPanel.Children (xaml property element) : class StackPanel kế thừa từ class Panel , class Panel lại định nghĩa Panel.Children như là XAML content property
+ Bỏ qua tag UIElementCollection object element : Panel.Children (XAML Property Element) có kiểu là UIElementCollection , UIElementCollection lại là hiện thực của IList.

    Attribute Syntax (Events)
- Attribute Syntax được dùng cho các member như là 1 event hơn là 1 thuộc tính.Tên của Attribute Syntax là tên của sự kiện.
- Trong WPF hiện thực 1 event của XAML : tên của sự kiện là tên của delegate của sự kiện xử lý.



3.Case Sensitive(Phân biệt hoa thường) & Khoảng trắng
- Tương tự như C# , XAML nhạy cảm và phân biệt viết hoa và viết thường cho tất cả các khái niệm trên như : Object Element , Property , Property Element ...riêng giá trị trong XAML có thể là non - case sensitive  phụ thuộc vào hành vi chuyển đổi giá trị liên qua đến thuộc tính nhận giá trị hoặc kiểu giá trị của thuộc tính.
- Ví dụ thuộc tính có kiểu là Boolean ta có thể viết true / True vẫn được.
- Về khoảng trắng XAML tự động bỏ những khoảng trắng ko cần thiết ,để tìm hiểu kỹ tiến trình bỏ khoảng trắng trong XAML , chúng ta nên tham khảo bài sau "Whitespace Processing in XAML."

4.Markup Extensions (Phần đánh dấu mở rộng)
- Markup Extensions là một khái niệm của XAML ,để bắt đầu sử dụng Markup Extensions ta dùng "{ }".
- Markup Extensions được sử dụng phổ biến nhất trong WPF là Binding , được dùng để thực hiện biểu thức ràng buộc dữ liệu và các Resource Reference : Static Resource , Dynamic Resource
- Bằng cách dùng Markup Extensions bạn có thể dùng Attribute Syntax cung cấp các giá trị cho các thuộc tính ngay cả khi các thuộc tính này không hỗ trợ Attribute Syntax
- Markup Extensions thường dùng các kiểu biểu thức trung gian để cho phép các tính năng như trì hoãn giá trị hoặc tham chiếu đến đối tượng khác mà chỉ xuất hiện ở thời điểm Run-time.
- Ví dụ sau đánh dấu giá trị của thuộc tính Style của Border dùng Attribute Syntax.Thuộc tính Style là khởi tạo của class Style mà theo mặc định không thể gán giá trị theo kiểu Attribute Syntax string , trong trường hợp này nó tham chiếu đến 1 Markup Extensions đặc biệt là StaticResource. Khi Markup Extensions được xử lý , nó sẽ trả về 1 tham chiếu đến style mà trước đây đã tạo như 1  x:Key với tên là "PageBackground"  trong Dictionary Resources của Root Element.

- Để hiểu rõ về danh sách các Markup Extension có sẵn bạn có thể tham khảo bài viết "WPF XAML Extensions"
- Để hiểu rõ về khái niệm Markup Extension bạn có thể tham khảo bài viết "Markup Extensions and WPF XAML"

5.Type Converter (Kiểu đã được chuyển đổi)
- Trong các phần đã giới thiệu về Attribute Syntax trước đây có nói đến vấn đề giá trị của thuộc tính phải được gán bằng giá trị kiểu string.
- Căn bản là các giá trị kiểu String này được chuyển đổi sang các kiểu object khác/giá trị nguyên thủy nhờ vào Native Processing.Nhờ vậy XAML hiểu được giá trị bạn gán vào thuộc tính như DataTime hay Uri và các kiểu phức tạp khác chỉ với thao tác là gán giá trị kiểu string.
- Điển hình là cấu trúc của Thickness.Thickness chỉ cho phép đo lường trong 1 hình chữ nhật lồng nhau, được dùng như giá trị của thuộc tính Margin.Bằng cách đặt 1 kiểu type converter trên Thickness , tất cả các thuộc tính dễ dàng dùng Thickness được ghi rõ ràng trong XAML
- Ví dụ sau dùng 1 type converter và 1 property syntax cung cấp giá trị cho 1 Margin



- Dưới đây là trường hợp sử dụng đầy đủ và ko cần thiết sử dụng property element syntax Button.Margin chứa object element syntax Thickness.Bốn thuộc tính của Thickness được thiết lập như Property Syntax trên một khởi tạo mới.

6.Root Element và Namespace
- Mỗi tập tin XAML chỉ có 1 root element  như : Window , Application , Page , Resource Dictionary
- Root Element chứa các thuộc tính xmlns & xmlns:x ,các thuộc tính này chỉ định bộ xử lý XAML, XAML namespace chứa các định nghĩa kiểu cho việc sao lưu các kiểu đánh dấu như Element.
- Thuộc tính xmlns chỉ định namespace XAML mặc định , trong các namespace XAML mặc định các object element có thể được xác định mà không cần đến 1 tiền tố.
- Namespace mặc định bao gồm :

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-Việc sử dụng xmlns nhằm xác định một phạm vi cho việc sử dụng và mapping của một namescope cho phù hợp với các đặc điểm kỹ thuật 1.0 XML.
- Lưu ý rằng các thuộc tính xmlns chỉ cần khai báo trên các root element của mỗi tập tin XAML,nó cho phép áp dụng xmlns này trên cả child element  nên việc khai báo trên các phần tử con vẫn được nhưng sẽ rất rối các đánh dấu.
    Tiền tố x:
- Phần trên, tiền tố x: được sử dụng để mapping không gian tên http://schemas.microsoft.com/winfx/2006/xaml XAML, đó là XAML không gian tên chuyên hỗ trợ cấu trúc ngôn ngữ XAML.Tiền tố x: được sử dụng để mapping không gian tên XAML này trong các template cho các project, trong ví dụ, và trong tài liệu hướng dẫn trong suốt bài viết này. Không gian tên XAML cho ngôn ngữ XAML chứa một số cấu trúc lập trình mà bạn sẽ sử dụng rất thường xuyên trong XAML của bạn. Sau đây là một danh sách các tiền tố x: phổ biến nhất bạn sẽ sử dụng:
x:Key: thiết lập 1 khóa duy nhất cho mỗi resource trong 1 ResourceDictionary. x:Key sẽ chiếm 90% tiền tố x: bạn sẽ sử dụng.
x:Class: xác định CLR namespace và class name cho các class cung cấp code-behind cho 1 XAML page. Bạn phải có code mã class sẽ hỗ trợ mã phía sau trên mỗi mẫu lập trình WPF của bạn.
x:Name: xác định tên phiên bản của run-time object name sau khi một object element được xử lý. Nói chung bạn thường xuyên sử dụng x:Name để có thể định danh phiên bản của object element và xử lý logic code hoặc để thay thế thuộc tính Name của các Object Element khi thuộc tính Name không dùng được trong một số bối cảnh code nhất định.
x:Static: Cho phép 1 tham chiếu trả về static value nhưng nó không phải là 1 thuộc tính XAML tương thích
x:Type: Xây dựng 1 tham chiếu Type dựa trên tên kiểu. Nó thì được dùng để xác định Type, như Style.TargetType, mặc dù thường thì có sự chuyển đổi tự nhiên string-to-Type nhưng với x:Type chúng ta dùng để lựa chọn kiểu mà chúng ta xác định được

7. Tiền tố tùy chỉnh và kiểu tùy chỉnh trong XAML
- Để bạn có thể tùy chỉnh và sử dụng 1 assembly của riêng bạn trong XAML và do chính bạn tạo ra nên nó nằm ngoài PresentaionCore , PresentationFrameWork và WindowBase bằng cách sử dụng custom prefix sau đó bạn có thể tham chiếu đến các Type trong assembly bạn đã xây dựng trước đó trong XAML.
Sau đây là một ví dụ rất cơ bản về cách sử dụng tiền tố tùy chỉnh làm việc trong XAML đánh dấu. Tiền tố tùy chỉnh được định nghĩa trong thẻ phần tử gốc, và ánh xạ tới một assemply cụ thể được đóng gói và có sẵn trong các ứng dụng.
- Trong assembly tên là CustomLibrary có chứa 1 không gian tên NumericUpDownCustomControl có lớp NumricUpDown

8. Khai báo tên của Element
- Thông thường để hiện thực 1 class trong một class khác bạn cần phải khởi tạo phiên bản của nó như một biến và sử dụng mà class không có một định danh nào rõ ràng , nhưng với các đối tượng Element trong XAML thì chúng có thể được tiêu chuẩn hóa vấn đề truy cập bằng định danh bằng việc khai báo giá trị cho thuộc tính x:Name va trong code-behind bạn có thể sử dụng định danh này mà không cần khởi tạo class thông qua InitializeComponent mà chúng ta sẽ không thảo luận trong bài viết này.
- Để tìm kiếm định danh của Element chúng ta dùng phương thức FindName() của namespace System.Windows của assemply PresentationFramework.dll như ví dụ sau : phương thức xử lý sự kiện của một button tìm một Element cụ thể bằng tên của nó ,StackPanel là FrameWorkElement root để tìm kiếm phần tử con của nó




http://blogs.msdn.com/b/hale/archive/2009/03/29/xaml-extensible-application-markup-language-ph-n-1.aspx?Redirected=true

Không có nhận xét nào :

Đăng nhận xét