Bài 3 CÁC ĐIỀU KHIỂN NÂNG CAO TRONG ỨNG DỤNG WPF

Similar documents
Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE:

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER

Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì?

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C#

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA

Tạo Project với MPLAB

Tài liệu hướng dẫn: Stored Procedure

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE)

Tình huống 1: PPPoE với Username và Password

Hướng dẫn cài đặt FPT

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào?

Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên

Bài tập lớn số 1. Giả lập bộ định thời

STACK và QUEUE. Lấy STACK

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1

CẤU TRÚC DỮ LIỆU NÂNG CAO

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách)

HƯỚNG DẪN SỬ DỤNG PLESK PANEL

Entity Framework (EF)

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì?

Chương 5. Network Layer 19/09/2016 1

SIMULATE AND CONTROL ROBOT

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY

Kỹ thuật thu nhỏ đối tượng trong Design (Layout)

MỤC LỤC. Giáo trình Thiết kế web Trang 1

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH)

Dọn "rác" Windows 7 vào dịp cuối năm

TỔNG QUAN VỀ.NET VÀ C#

1 Bước 1: Test thử kit LaunchPad.

LINQ TO SQL & ASP.NET

GV: Phạm Đình Sắc or

Nhấn nút New để tạo 1 biến mới Trang 17

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3

Bài 10: Cấu trúc dữ liệu

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG

NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU. Bài 10: Thư viện Pandas (2)

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức)

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây:

Google Search Engine. 12/24/2014 Google Search Engine 1

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT

Lecture 12. Trees (1/2) Nội dung bài học:

BELGIUM ONLINE APPOINTMENT

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam;

Mạng máy tính - Computer Network: Hệ. Giao thức - Protocol:

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU

Tìm hiểu Group Policy Object và các ví dụ

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Bài 10. Cấu trúc liên nối. khác nhau được gọi là cấu trúc liên nối. nhu cầu trao đổi giữa các module.

Đa ngôn ngữ (Internationalization) trong Servlet

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN

BẢO MẬT TRONG SQL SERVER

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5.

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG HOSTING PLESK PANEL

PHÁT TRIỂN ỨNG DỤNG WEB

Bài 7: Các cấu trúc điều khiển

I. Hướng Dẫn Đăng Nhập:

[ASP.NET] MVC Framework và ví dụ minh họa

2.4. GIAO THỨC MQTT Các khái niệm cơ bản MQTT được phát triển bởi IBM và Eurotech, phiên bản mới nhất là MQTT 3.1 MQTT (Giao vận tầm xa) là

Mô hình dữ liệu quan hệ (Relational data model)

LÂ P TRI NH WEB ASP.NET

Kích hoạt phương thức xa (RMI- Remote Method Invocation )

SIEMENS INDUSTRIAL NETWORKS

B3: Bên khung Package Explore bên trái đi tới thư mục res, bạn sẽ thấy có 3 thư mục con:

MA NG MA Y TI NH (Computer Networks)

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM)

JAVASCRIPT. Giảng viên : Ths. PHẠM ĐÀO MINH VŨ

dụng một chính sách, điều này giúp dễ dàng quản lý và cung cấp tính năng Load Balancing (cân bằng tải) phục vụ tốt hơn các yêu cầu của tổ chức.

Chủ đề 7: Triển khai và Bảo trì. COMP1026 Introduction to Software Engneering CH7-1 HIENLTH

Parallels Cloud Server 6.0

PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG NÂNG CAO

HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG

CHƯƠNG VII CASCADING STYLE SHEET-CSS

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN

BÀI LAB ĐỔI TÊN DOMAIN

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

Bài thực hành số 2 QUYỀN và ROLE

NHÚNG. Vi ñiều khiển BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 2

HƯỚNG DẪN SỬ DỤNG NHANH MINDJET MIND MANAGER

Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MINICHAT. Bài giảng 3. Trang1. Khoa Khoa Học Và Kỹ Thuật Máy Tính

Time Picker trong Android

Cấu hình Router FTTH ---X---

BÀI THỰC HÀNH SỐ 1. Quản trị tập tin: 1/ Tạo các thư mục sau: Bài tập thực hành linux Linuxlab. bt1 bt11 bt111. bt121. bt12. bh1 bh11 bh111.

Lập trình chuyên nâng cao. Lập trình phân tán (Distributed computing

CHƯƠNG 5: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG VB.NET

Tối ưu Server để tăng tốc website bằng mod_pagespeed

Transcription:

Bài 3 CÁC ĐIỀU KHIỂN NÂNG CAO TRONG ỨNG DỤNG WPF Không dừng lại ở việc cung cấp những điều khiển UI như ComboBox, ListBox, TextBox,, với những chức năng cơ bản và đặc tính text đơn điệu như trong Windows Form, WPF còn cho phép người lập trình tùy biến thuộc tính của những điều khiển trên để biến chúng thành những điều khiển UI phức hợp, với nhiều đặc tính giao diện phong phú, tinh tế, kết hợp text, hình ảnh, Để đạt được hiệu quả tương tự, với những công nghệ trước đây như MFC, cần tiêu tốn nhiều công sức lập trình. Qua các ví dụ cụ thể trong bài giảng này, chúng ta sẽ thấy WPF tạo ra chúng đơn giản như thế nào. 1 Hộp lựa chọn phông chữ (Font Chooser) Mục tiêu của phần này là tạo lập một điều khiển dạng ComboBox, trong đó, liệt kê danh sách các phông chữ hệ thống. Tên của mỗi phông chữ lại được hiển thị dưới dạng chính phông chữ đó. Điều này cho phép người dùng xem trước định dạng phông chữ trước khi chọn chúng. Bạn có thể đã quen thuộc với dạng Combox này khi sử dụng các ứng dụng gần đây của Microsoft Office như Word, Excel, PowerPoint, Và sau đây là mã XAML để tạo ra điều khiển này: <!--Sử dụng stack panel theo chiều dọc làm layout chính của form--> <StackPanel Width="250" Orientation="Vertical" Height="100" > <!--Khai báo tạo lập tiêu đề của điều khiển--> <TextBlock FontFamily="Verdana" FontWeight="DemiBold"> Danh mục phông hệ thống: </TextBlock> <!--Khai báo tạo điều khiển Combox--> <ComboBox ItemsSource="{x:Static Fonts.SystemFontFamilies}" SelectedIndex="0"> <!--Khai báo định nghĩa thuộc tính dữ liệu gắn với mỗi mục chọn--> <ComboBox.ItemTemplate> <DataTemplate> Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 1

<TextBlock Text="{Binding}" FontFamily="{Binding}"/> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> Trong phần khai báo tạo điều khiển ComboBox, ta khai báo nguồn dữ liệu được dùng cho các mục trong hộp danh sách thông qua thuộc tính ItemsSource. Bằng việc gán ItemsSource="{x:Static Fonts.SystemFontFamilies}" ta định nghĩa nguồn dữ liệu này là danh sách các phông chữ hiện có của hệ thống máy tính hiện thời. Thuộc tính SelectedIndex cho phép định ra chỉ số của chỉ mục ngầm định được chọn ban đầu trong danh sách phông, cụ thể trong trường hợp này là phông chữ đầu tiên (SelectedIndex="0"). Trong phần khai báo định nghĩa thuộc tính dữ liệu của mỗi chỉ mục trong ComboBox (phần tử <ComboBox.ItemTemplate>), ta lồng vào một điều khiển TextBlock, trong đó, nội dung hiển thị là phông chữ tương ứng (Text="{Binding}") và dạng phông hiển thị nội dung cũng chính là phông chữ tương ứng với chỉ mục này (FontFamily="{Binding}"). Những vấn đề liên quan đến kết nối nguồn dữ liệu sẽ được đề cập chi tiết hơn trong các bài giảng tiếp sau. Biên dịch và chạy chương trình, ta có kết quả như minh họa ở Hình 3.1. Như vậy, chỉ với không hơn 20 dòng mã XAML, chúng ta đã có thể tạo ra một điều khiển rất hữu dụng. Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 2

Hình 3.1 Hộp lựa chọn phông chữ được xây dựng bằng WPF 2 Hộp danh mục ảnh (Image ListBox) Trong phần này, ta xây dựng một hộp danh mục (ListBox) các đồ uống có kèm theo ảnh. Rõ ràng tính trực quan của giao diện người dùng sẽ tăng hơn nhiều so với một danh sách dạng text đơn điệu. 2.1 Thêm dữ liệu ảnh vào tài nguyên của project Trước hết, ta thêm các ảnh đồ uống cần thiết vào tài nguyên của project theo các bước sau: - Ở cửa sổ Solution Explorer, ta nhắp chuột phải vào tên project Xuất hiện bảng chọn chức năng. - Chọn mục Add >Existing Item Xuất hiện cửa sổ cho phép lựa chọn file. - Trong hộp danh sách Files of type, ta chọn Image Files Các file ảnh trong thư mục hiện thời sẽ xuất hiện. - Tìm đến các file ảnh cần hiển thị trong danh sách và chọn OK. - Kết quả, trong cửa sổ Solution Explorer, ta thấy xuất hiện các file ảnh tương ứng. Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 3

2.2 Xây dựng mã XAML Giả thiết rằng các file ảnh đã được nạp vào project, sau đây là mã XAML tạo lập hộp danh mục đồ uống theo yêu cầu: <!--Khai báo tạo lập một hộp danh mục với các thuộc tính về căn lề, chiều rộng, --> <ListBox Margin="10,10,0,13" Width="280" Name="listBox1" HorizontalAlignment="Left" VerticalAlignment="Top"> <!--Khai báo tạo lập một chỉ mục con trong hộp danh mục với thuộc tính màu nền--> <ListBoxItem Background="Beige"> <!--Lồng vào chỉ mục này một StackPanel để có thể chứa nhiều hơn 1 phần tử UI con theo chiều ngang--> <!--Khai báo tạo lập một ảnh đồ uống ở đầu mỗi chỉ mục--> <Image Width="50" Height="50" Source="orange_juice.jpg"></Image> <!--Khai báo tạo lập một dòng chữ chỉ tên đồ uống--> <TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Nước cam tươi</textblock> <!--Khai báo chỉ mục 2 tương tự như trên--> <Image Width="50" Height="50" Source="kiwi_juice.jpg"></Image> <TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Nước kiwi ép</textblock> <!--Khai báo chỉ mục 3 tương tự như trên--> <ListBoxItem Background="Beige"> Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 4

<Image Width="50" Height="50" Source="mango_juice.jpg"></Image> <TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Nước soài ép</textblock> <!--Khai báo chỉ mục 4 tương tự như trên--> <Image Width="50" Height="50" Source="milk.jpg"></Image> <TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Sữa tươi tiệt trùng</textblock> <!--Khai báo chỉ mục 5 tương tự như trên--> <ListBoxItem Background="Beige"> <Image Width="50" Height="50" Source="coffee.jpg"></Image> <TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Cà phê Espresso</TextBlock> </ListBox> Như vậy, điểm mấu chốt để bổ sung thêm các thuộc tính giao diện như ảnh, text, checkbox,, vào mỗi chỉ mục của hộp danh sách chính là việc kết hợp các phần tử UI riêng lẻ tương ứng vào cùng một phần tử Panel nằm trong khai báo chỉ mục. Trong trường hợp này, với mỗi khai báo chỉ mục ta thêm vào một theo chiều ngang, trong đó, chứa một phần tử <Image> và 1 phần tử <TextBlock>. Nguồn dữ liệu ảnh được xác định qua thuộc tính Source="<tên ảnh đã được bổ sung vào project>". Kết quả của đoạn code được minh hoạ trong hình 3.2. Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 5

Hình 3.2 Danh mục đồ uống có kèm ảnh minh hoạ xây dựng bằng WPF 3 Hộp mở rộng (Expander) Hộp mở rộng Expander là một trong những điều khiển UI mới được giới thiệu trong WPF như một điều khiển cơ bản. Expander cho phép thu gọn hoặc mở rộng một nội dung nào đó chứa trong nó, giống như một node trong TreeView, bằng việc click vào biểu tượng mũi tên (hướng lên, nếu điều khiển đang ở trạng thái mở rộng; hướng xuống, nếu đang ở trạng thái thu gọn). Điều khiển này rất tiện lợi: Khi diện tích form chính quá chật hẹp vì nhiều chức năng được trình bày trên cùng giao diện, ta có thể sử dụng Expander để chứa một số chức năng ít dùng có thể tạm thời được ẩn dưới một tên nhóm chung. Trong ví dụ sau đây, ta sẽ làm một menu chứa 2 mục là đồ uống và đồ ăn, mỗi mục sẽ chứa danh sách các sản phẩm tương ứng mà nhà hàng cung cấp. Ta sử dụng Expander để có thể mở rộng/thu gọn từng mục nêu trên. Sau đây là mã XAML của ứng dụng: <Window x:class="lesson3.window2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Lesson 3 - Expander WPF Sample" Height="250" Width="200"> Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 6

<!--Sử dụng stackpanel làm layout chính--> <StackPanel> <!--Khai báo tạo lập Expander chứa danh mục đồ uống--> <Expander FontFamily="Times New Roman" FontSize="14" FontStyle="Oblique" Header="Đồ uống" Background="#acbf43" > <!---Khai báo ListBox chứa danh mục đồ uống--> <ListBox > <!--Khai báo các chỉ mục con trong danh mục đồ uống--> <!--Mỗi mục con được trang trí bằng một biểu tượng đi kèm text--> <Image Source="glass.jpg" Height="20"></Image> <TextBlock VerticalAlignment="Center">Nước chanh leo</textblock> <Image Source="glass.jpg" Height="20"></Image> <TextBlock VerticalAlignment="Center">Nước cam vắt</textblock> <Image Source="glass.jpg" Height="20"></Image> <TextBlock VerticalAlignment="Center">Nước mơ muối</textblock> <Image Source="glass.jpg" Height="20"></Image> <TextBlock VerticalAlignment="Center">Sữa chua đánh đá</textblock> Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 7

</ListBox> </Expander> <!--Khai báo Expander chứa danh mục đồ ăn--> <Expander FontFamily="Times New Roman" FontSize="14" FontStyle="Oblique" Header="Đồ ăn" Background="DarkOrange"> <ListBox> <!--Khai báo các chỉ mục con trong danh mục đồ ăn--> <Image Source="bowl.gif" Height="20"></Image> <TextBlock VerticalAlignment="Center">Phở tái gàu</textblock> <Image Source="bowl.gif" Height="20"></Image> <TextBlock VerticalAlignment="Center">Bún bò giò heo</textblock> <Image Source="bowl.gif" Height="20"></Image> <TextBlock VerticalAlignment="Center">Bánh cuốn tôm nõn</textblock> <Image Source="bowl.gif" Height="20"></Image> <TextBlock VerticalAlignment="Center">Bánh đa cua</textblock> </ListBox> Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 8

</Expander> </Window> Như ta thấy việc sử dụng Expander trong WPF rất đơn giản, với cùng nguyên tắc như các điều khiển UI cơ bản khác. Ở đây ta sử dụng 2 hộp mở rộng Expander: một chứa danh mục đồ uống được đặt trong một ListBox; một chứa danh mục đồ ăn trong một ListBox. Kết quả của đoạn code được minh hoạ trong Hình 3.3. a) b) c) Hình 3.3 Tạo lập và sử dụng hộp mở rộng bằng WPF: a) Hai danh mục cùng thu gọn; b) Danh mục Đồ ăn được mở rộng; c) Cả hai danh mục được mở rộng (Danh mục trên đẩy danh mục dưới xuống) Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 9

4 Hộp soạn văn bản đa năng (RichTextBox) Hộp soạn văn bản đa năng RichTextBox là một trong những điều khiển có chức năng phong phú. Không chỉ cho phép soạn sửa và hiển thị các nội dung text đơn thuần, RichTextBox còn cho phép thay đổi phông chữ (Verdana, Times New Roman, ), kiểu chữ (nghiêng, đậm, gạch chân), Đặc biệt, điều khiển RichTextBox trong WPF/.NET 3.0 còn cho phép kiểm tra/gợi ý sửa đổi lỗi chính tả tiếng Anh của nội dung văn bản chứa trong đó. RichTextBox trong WPF/.NET 3.0 là phần tử được cải tiến về cơ bản so với phiên bản trước của điều khiển RichTextBox trong.net 2.0. Tuy nhiên, cùng với sự mở rộng về chức năng là việc bổ sung các API mới cũng như những cách thức sử dụng khác. 4.1 Chức năng cơ bản Để thêm mới một hộp soạn thảo đa năng vào form, ta dùng mã XAML như sau: <RichTextBox x:name="xamlrichbox" SpellCheck.IsEnabled="True" MinHeight="100"></RichTextBox> Thuộc tính x:name là từ khoá xác định danh tính của RichTextBox được tạo. Thuộc tính này đóng vai trò là tham chiếu cho phép ta sau này buộc mã lệnh C# vào điều khiển. Thuộc tính MinHeight xác định số dòng có thể thấy được của hộp soạn thảo, giá trị này ngầm định bằng 1. Thuộc tính SpellCheck.IsEnabled="True" kích hoạt tính năng kiểm tra lỗi chính tả tiếng Anh trong nội dung văn bản và gợi ý những từ đúng có thể để thay thế, giống như Microsoft Word. Tuy nhiên, nếu chỉ với một RichTextBox, ta không có cách nào để sửa đổi định dạng của văn bản trong RichTextBox như đánh chữ nghiêng, chữ đậm, đổi phông chữ, vân vân. Muốn đạt được điều này, ta phải buộc mã lệnh vào giao diện Command của RichTextBox. 4.2 Giao diện Command Microsoft chủ trương để người phát triển làm việc với RichTextBox thông qua giao diện Command. Mặc dù khái niệm này không mới đối với phần lớn người phát triển giao diện đồ hoạ người dùng, việc cài đặt và cú pháp trong XAML có chút khác biệt. Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 10

Ta cần thêm một ToolBar và một số nút bấm hai trạng thái (ToggleButton) để gắn lệnh điều khiển RichTextBox đã tạo. Thuộc tính Command trên mỗi điểu khiển kể trên sẽ xác định chức năng mà ta muốn kích hoạt trên RichTextBox,. Trong khi đó, thuộc tính CommandTarget xác định RichTextBox nào ta muốn chức năng kích hoạt của các nút bấm nhằm vào. Sau đây là đoạn mã XAML bổ sung thêm một ToolBar và 3 nút bấm hai trạng thái: <!--Khai báo sử dụng Toolbar--> <ToolBar> <!--Khai báo nút bấm kích hoạt lệnh tô đậm đoạn chữ được chọn trong RichTextBox--> <ToggleButton MinWidth="40" Command="EditingCommands.ToggleBold" CommandTarget="{Binding ElementName=XAMLRichBox}" TextBlock.FontWeight="Bold">B</ToggleButton> <!--Khai báo nút bấm kích hoạt lệnh in nghiêng đoạn chữ được chọn trong RichTextBox--> <ToggleButton MinWidth="40" Command="EditingCommands.ToggleItalic" CommandTarget="{Binding ElementName=XAMLRichBox}" TextBlock.FontStyle="Italic">I</ToggleButton> <!--Khai báo nút bấm kích hoạt lệnh gạch chân đoạn chữ được chọn trong RichTextBox--> <ToggleButton MinWidth="40" Command="EditingCommands.ToggleUnderline" CommandTarget="{Binding ElementName=XAMLRichBox}"> <TextBlock TextDecorations="Underline">U</TextBlock> </ToggleButton> </ToolBar> Mặc dù đoạn mã ví dụ chỉ bao gồm một số ít các nút lệnh (Command="EditingCommands.ToggleBold", Command="EditingCommands.ToggleBold", Command="EditingCommands.ToggleItalic"), có tổng cộng 47 lệnh khác nhau mà ta có thể lựa chọn (có thể xem chúng bằng cách khảo sát lớp EditingCommands). Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 11

Dưới đây là đoạn mã XAML đầy đủ cho phép ta xây dựng một hộp soạn thảo văn bản có thể thay đổi được kiểu chữ (đậm, nghiêng, gạch chân): <Window x:class="lesson3.window3" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Lesson3 - Rich Text Box" Height="300" Width="300" > <!--Sử dụng StackPanel làm layout chính--> <StackPanel Orientation="Vertical"> <!--Khai báo toolbar--> <ToolBar> <!--Nút tô đậm--> <ToggleButton MinWidth="40" Command="EditingCommands.ToggleBold" CommandTarget="{Binding ElementName=XAMLRichBox}" TextBlock.FontWeight="Bold">B </ToggleButton> <!--Nút in nghiêng--> <ToggleButton MinWidth="40" Command="EditingCommands.ToggleItalic" CommandTarget="{Binding ElementName=XAMLRichBox}" TextBlock.FontStyle="Italic">I </ToggleButton> <!--Nút gạch chân--> <ToggleButton MinWidth="40" Command="EditingCommands.ToggleUnderline" CommandTarget="{Binding ElementName=XAMLRichBox}"> <TextBlock TextDecorations="Underline">U</TextBlock> </ToggleButton> </ToolBar> <!--Khai báo tạo lập RichTextBox--> Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 12

MinHeight="100"> <RichTextBox x:name="xamlrichbox" SpellCheck.IsEnabled="True" </RichTextBox> </Window> Kết quả được minh hoạ trong Hình 3.4. Hình 3.4 Xây dựng hộp soạn thảo đa năng đơn giản với các chức năng thay đổi kiểu chữ bằng WPF Câu hỏi ôn tập 1. Thuộc tính nào của một ComboBox cho phép khai báo nguồn dữ liệu? A. SelectedIndex B. ItemSource C. Text D. FontFamily Trả lời: B Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 13

2. Trong hộp chọn phông chữ, danh sách phông chữ hệ thống được lấy từ lớp nào? A. Fonts.SystemFontFamilies B. Fonts.SystemTypefaces C. FontFamilyMapCollection Trả lời: A 3. Trong ví dụ về danh mục ảnh ở mục 3, phát triển thêm tính năng mới bằng việc bổ sung các check box vào đầu mỗi mục đồ uống. Một nút bấm có trách nhiệm hiển thị những đồ uống mà người dùng đã chọn bằng việc đánh dấu checkbox (chú ý có thể nhiều hơn 1 lựa chọn). Kết quả như trong hình minh hoạ dưới đây: Gợi ý: - Thêm điều khiển CheckBox vào mỗi chỉ mục con của ListBox đang dùng. Với mỗi điều khiển CheckBox, thêm hàm xử lý sự kiện Uncheck và Check. Viết mã C# các hàm tương ứng trong file code-behind của form chứa. - Thêm điều khiển Button vào sau ListBox (ví dụ, dùng StackPanel). Thêm hàm xử lý sự kiện Click của Button. Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 14

Sau đây là mã ví dụ: Phần mã XAML: <Window x:class="lesson3.window4" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Lesson3 - Cau hoi on tap 3" Height="400" Width="300" > <StackPanel> <!--Khai báo tạo lập một hộp danh mục với các thuộc tính về căn lề, chiều rộng, tên gọi,...--> <ListBox Margin="10,10,0,13" Width="280" Name="listBox1" HorizontalAlignment="Left" VerticalAlignment="Top"> <!--Khai báo tạo lập một chỉ mục con trong hộp danh mục với thuộc tính màu nền--> <ListBoxItem Background="Beige"> <!--Lồng vào chỉ mục này một StackPanel để có thể chứa nhiều hơn 1 phần tử UI con theo chiều ngang--> <CheckBox x:name="chkorangejuice" Checked="HandleChecked" Unchecked="HandleUnchecked"></CheckBox> <!--Khai báo tạo lập một ảnh đồ uống ở đầu mỗi chỉ mục--> <Image Width="50" Height="50" Source="orange_juice.jpg"></Image> <!--Khai báo tạo lập một dòng chữ chỉ tên đồ uống--> <TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Nước cam tươi</textblock> <!--Khai báo chỉ mục 2 tương tự như trên--> <CheckBox x:name="chkkiwijuice" Checked="HandleChecked" Unchecked="HandleUnchecked"></CheckBox> <Image Width="50" Height="50" Source="kiwi_juice.jpg"></Image> Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 15

<TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Nước kiwi ép</textblock> <!--Khai báo chỉ mục 3 tương tự như trên--> <ListBoxItem Background="Beige"> <CheckBox x:name="chkmangojuice" Checked="HandleChecked" Unchecked="HandleUnchecked"></CheckBox> <Image Width="50" Height="50" Source="mango_juice.jpg"></Image> <TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Nước soài ép</textblock> <!--Khai báo chỉ mục 4 tương tự như trên--> <CheckBox x:name="chkmilk" Checked="HandleChecked" Unchecked="HandleUnchecked"></CheckBox> <Image Width="50" Height="50" Source="milk.jpg"></Image> <TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Sữa tươi tiệt trùng</textblock> <!--Khai báo chỉ mục 5 tương tự như trên--> <ListBoxItem Background="Beige"> <CheckBox x:name="chkcafe" Checked="HandleChecked" Unchecked="HandleUnchecked"></CheckBox> <Image Width="50" Height="50" Source="coffee.jpg"></Image> <TextBlock Margin="5" VerticalAlignment="Center" FontFamily="Times New Roman" FontStyle="Italic" FontSize="18">Cà phê Espresso</TextBlock> </ListBox> Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 16

<!--Khai báo nút bấm kích hoạt hiển thị đồ uống được chọn --> <Button Click="DislayCustomerChoices" Width="70">Gọi đồ uống</button> </Window> Phần mã C#: public partial class Window4 : System.Windows.Window { //Đặt các cờ xác định lựa chọn tương ứng với các loại đồ uống bool selectedorange; bool selectedkiwi; bool selectedmango; bool selectedmilk; bool selectedespesso; public Window4() { InitializeComponent(); // //Khởi tạo biến đánh dấu chọn selectedorange = false; selectedkiwi = false; selectedmango = false; selectedmilk = false; selectedespesso = false; } //Hàm xử lý sự kiện bỏ chọn (Unchecked) của mỗi checkbox //Lưu ý: Ở đây ta chỉ sử dụng một hàm duy nhất xử lý sự kiện này cho mọi checkbox //Để phân biệt checkbox nào phát động sự kiện, ta dựa vào tham số sender và so sánh nó với các checkbox private void HandleUnchecked(object sender, RoutedEventArgs e) { if (sender.equals(chkcafe))selectedespesso = false; if (sender.equals(chkkiwijuice)) selectedkiwi = false; Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 17

if (sender.equals(chkmangojuice)) selectedmango = false; if (sender.equals(chkmilk)) selectedmilk = false; if (sender.equals(chkorangejuice)) selectedorange = false; } như trên) //Hàm xử lý sự kiện bỏ chọn (checked) của mỗi checkbox (tương tự private void HandleChecked(object sender, RoutedEventArgs e) { if (sender.equals(chkcafe)) selectedespesso = true; if (sender.equals(chkkiwijuice)) selectedkiwi = true; if (sender.equals(chkmangojuice)) selectedmango = true; if (sender.equals(chkmilk)) selectedmilk = true; if (sender.equals(chkorangejuice)) selectedorange = true; } e) //Hàm xử lý sự kiện hiển thị các đồ uống được chọn private void DislayCustomerChoices(object sender, RoutedEventArgs { String choices = "Ban da chon "; bool selected = false; // if (selectedorange) { choices += "Nuoc cam; "; selected = true; } // if (selectedmilk) { choices += "Sua tuoi; "; selected = true; } // if (selectedmango) { Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 18

} } choices += "Nuoc soai ep; "; selected = true; } // if (selectedespesso) { choices += "Cafe Espresso;"; selected = true; } // if (!selected) choices = "Ban chua chon do uong nao"; // MessageBox.Show(choices); 4. Trong điều khiển Expander, ta thường tạo dòng text mô tả nội dung bên trong của Expander, luôn xuất hiện trên Expander bên cạnh mũi tên chỉ trạng thái của Expander. Muốn thiết lập nội dung của dòng text này, ta dùng thuộc tính gì của điều khiển Expander? A. Content B. Text C. Header D. Source Trả lời: C 5. Trong ToolBar kết hợp với RichTextBox, thuộc tính nào của nút bấm hai trạng thái ToggleButton xác định chức năng sửa đổi văn bản cần kích hoạt? A. Command B. CommandTarget C. Cả hai thuộc tính trên Trả lời: A 6. Trong ToolBar kết hợp với RichTextBox, thuộc tính nào của nút bấm hai trạng thái ToggleButton xác định đối tượng RichTextBox có chức năng sửa đổi văn bản cần kích hoạt? Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 19

A. Command B. CommandTarget C. Cả hai thuộc tính trên Trả lời: B Tài liệu tham khảo 1.Creating ImageListBox in WPF, URL: http://windowsclient.net/blogs/ilves/archive/2008/02/14/creating-imagelistbox-in-wpf.aspx 2.WPF ListBox Tutorial, URL: http://www.longhorncorner.com/uploadfile/lheditor/wpflb08262008103013am/wpflb.aspx 3. WPF Sample Series - Expander Control With Popup Content. URL: http://karlshifflett.wordpress.com/2008/02/05/wpf-sample-series-expander-control-with-popup-content/ 4. WPF RichTextBox, URL: http://www.csharpcorner.com/uploadfile/mahesh/wpfrichtextbox09072008194855pm/wpfrichtextbox.aspx 5. Mastering the WPF RichTextBox, URL: http://www.devx.com/dotnet/article/34644 Microsoft Vietnam DPE Team WPF Bài 3: Các điều khiển nâng cao trong WPF 20