WPF – Routed Command cơ bản

Routed Command là cách được dùng để gắn kết một command cho một control nào đó như các phần tử trên menu hoặc toolbar mà không cần phải viết mã xử lý cho chúng. Không chỉ cung cấp sẵn hầu hết các command mà ứng dụng cần đến, bạn còn có thể thiết lập các phím tắt để kích hoạt và thay đổi cách thức mà command hoạt động.

Các loại Routed Command

Trong WPF, các command được chia thành 5 nhóm là:

  • ApplicationCommands: các command liên quan đến ứng dụng, tài liệu, bao gồm cả clipboard. Ví dụ: Save, Print, Cut, Paste,…
  • NavigationCommands: các command để duyệt trong browser như BrowserBack, BrowserForward, Favorites, Search, Room,…
  • EditingCommands: các command dùng trong soạn thảo văn bản như AlignLeft, AlignRight, Delete, Select…
  • ComponentCommands: các command điều khiển các thành phần giao diện về lựa chọn và di chuyển như MoveUp, MoveDown, SelectToEnd, SelectToHome,…
  • MediaCommands: các command về multimedia như Play, Pause, Stop, IncreaseVolumn,…

Để gán command cho control, bạn chỉ cần gán tên của command tương ứng cho property Command của control đó trong tài liệu XAML. Bạn có thể viết tên đầy đủ của command như ApplicationCommands.Cut hay chỉ cần viết là Cut.

Ví dụ sau cho thấy cách sử dụng command để tạo các menu chức năng Copy, Cut, Paste để sử dụng cho bất kì TextBox nào có trong cửa sổ:

<Window x:Class="RoutedCommandDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Routed Command Demo" Height="300" Width="500">
    <StackPanel>
        <Menu>
            <MenuItem Header="Cut" Command="Cut" />
            <MenuItem Header="Copy" Command="Copy" />
            <MenuItem Header="Paste" Command="Paste" />
        </Menu>
        <TextBox Height="100" Margin="5" />
        <TextBox Height="100" Margin="5" />
    </StackPanel>
</Window>

Khi chạy ví dụ, bạn có thể thấy các menu có thể được sử dụng cho cả hai TextBox, tùy thuộc vào bạn đang đặt focus vào TextBox nào.

 

Tạo Routed Command trong code-behind

Một Routed Command được hiện thực từ interface ICommand gồm hai phương thức là Execute() và CanExecute(). Khi tạo một Routed Command, bạn sử dụng lớp RoutedCommand, đây là lớp duy nhất trong WPF hiện thực ICommand. Mọi lớp command khác (như RoutedUICommand) đều được kế thừa từ lớp này.

Bạn có thể nhận ra rằng phương thức CanExecute() được dùng để kiểm tra command có thể được thi hành hay không. Tùy vào giá trị của phương thức này mà control được gắn command sẽ được vô hiệu hóa hay không, như bạn có thể thấy trong ví dụ trên.

Một Routed Command được tạo thành từ 5 đối tượng:

  • Command: đối tượng đại diện cho command như ApplicationCommands.Cut, ApplicationCommands.Copy, …
  • Input binding: mối kết hợp giữa input và command. Ví dụ bạn có thể nhấn Ctrl+C để kích hoạt command Copy. Lớp tương ứng trong WPF là InputBinding.
  • Command binding: mối kết hợp giữa command và phương thức xử lý. Lớp tương ứng trong WPF là CommandBinding. Lớp này cho phép bạn gán các phương thức xử lý thông qua hai property điển hình là CommandBinding.Executed và CommandBinding.CanExecuted.
  • Command source: đối tượng kích hoạt command như Button, MenuItem,…
  • Command target: đối tượng mà command sẽ tác động lên.

Khi đã tạo ra các InputBinding và CommandBinding, bạn cần thêm chúng vào các collection tương ứng là UIElement.InputBindings và UIElement.CommandBindings cho control mà bạn cần gắn command.

Ví dụ gắn command Cut cho textBox1, đồng thời sử dụng thêm phím tắt là Ctrl+D để kích hoạt command này.

public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();

        InputBinding ib = new InputBinding(ApplicationCommands.Cut,
            new KeyGesture(Key.D, ModifierKeys.Control));

        textBox1.InputBindings.Add(ib);
        CommandBinding cb = new CommandBinding(ApplicationCommands.Cut);
        cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);
        cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);

        textBox1.CommandBindings.Add(cb);

    }
    void cb_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        MessageBox.Show(textBox.SelectedText);
        Clipboard.SetText(textBox.SelectedText);
        textBox.SelectedText = String.Empty;
    }
    void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        e.CanExecute =  !String.IsNullOrEmpty(textBox.SelectedText);
    }
}

https://yinyangit.wordpress.com

Bài liên quan:

4 thoughts on “WPF – Routed Command cơ bản

  1. Pingback: Cơ bản về MVVM (Model – View – ViewModel) Pattern « Nguyễn Ngọc Vạn's Blog

  2. Pingback: Giới thiệu về MVVM (Model – View – ViewModel) Pattern « Cuộc Sống Và Khoa Học

  3. Pingback: Cơ bản về MVVM (Model – View – ViewModel) Pattern – nguyenleblog

  4. Pingback: C# – Kiểm tra tổ hợp phím, phân biệt KeyCode, KeyValue và KeyData | NGỌC TẤN KIẾN THỨC LẬP TRÌNH AN GIANG

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s