TOC

This article is currently in the process of being translated into Vietnamese (~97% done).

Common interface controls:

The WPF ContextMenu

Một trình đơn ngữ cảnh, thường được gọi là một popup hoặc trình đơn bật lên, là một trình đơn được thể hiện theo hành động người dùng nhất định, thường là một nhấp chuột phải chuột vào một kiểm soát cụ thể hoặc cửa sổ. Thực đơn ngữ cảnh thường được sử dụng để cung cấp chức năng có liên quan trong một điều khiển duy nhất.

WPF đi kèm với một điều khiển ContextMenu và bởi vì nó hầu như luôn luôn được gắn với một kiểm soát cụ thể, đó cũng là thường làm thế nào bạn thêm nó vào giao diện. Điều này được thực hiện thông qua ContextProperty, mà tất cả các điều khiển exposes (nó xuất phát từ FrameworkElement mà WPF hầu hết điều khiển thừa hưởng từ). Hãy xem xét ví dụ sau để xem làm thế nào nó được thực hiện:

<Window x:Class="WpfTutorialSamples.Common_interface_controls.ContextMenuSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ContextMenuSample" Height="250" Width="250">
    <Grid>
        <Button Content="Right-click me!" VerticalAlignment="Center" HorizontalAlignment="Center">
            <Button.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Menu item 1" />
                    <MenuItem Header="Menu item 2" />
                    <Separator />
                    <MenuItem Header="Menu item 3" />
                </ContextMenu>
            </Button.ContextMenu>
        </Button>
    </Grid>
</Window>

Nếu bạn đã đọc các chương trên thực đơn thường xuyên, bạn sẽ sớm nhận ra rằng ContextMenu hoạt động chính xác theo cùng một cách, và không có thắc mắc, vì cả hai đều thừa kế lớp MenuBase. Cũng giống như chúng ta đã thấy trong các ví dụ về cách sử dụng trình đơn thông thường, bạn có thể của khóa học thêm sự kiện nhấp chuột vào các mục để xử lý khi người dùng nhấp chuột vào chúng, nhưng một cách WPF phù hợp hơn là sử dụng lệnh.

ContextMenu kết hợp Commands và icons

Trong ví dụ sau này, tôi sẽ chỉ cho bạn hai khái niệm quan trọng khi sử dụng ContextMenu: sử dụng lệnh WPF, mà sẽ cung cấp cho chúng tôi với rất nhiều chức năng bao gồm một trình xử lý sự kiện Click, một văn bản và một văn bản phím tắt, chỉ đơn giản bằng cách gán cho một cái gì đó để lệnh bất động sản. Tôi cũng sẽ cho bạn sử dụng các biểu tượng trên mục ContextMenu. Có một cái nhìn:

<Window x:Class="WpfTutorialSamples.Common_interface_controls.ContextMenuWithCommandsSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ContextMenuWithCommandsSample" Height="200" Width="250">
    <StackPanel Margin="10">
        <TextBox Text="Right-click here for context menu!">
            <TextBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Command="Cut">
                        <MenuItem.Icon>
                            <Image Source="/WpfTutorialSamples;component/Images/cut.png" />
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Command="Copy">
                        <MenuItem.Icon>
                            <Image Source="/WpfTutorialSamples;component/Images/copy.png" />
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Command="Paste">
                        <MenuItem.Icon>
                            <Image Source="/WpfTutorialSamples;component/Images/paste.png" />
                        </MenuItem.Icon>
                    </MenuItem>
                </ContextMenu>
            </TextBox.ContextMenu>
        </TextBox>
    </StackPanel>
</Window>

Cố gắng chạy các ví dụ và xem cho chính mình bao nhiêu chức năng mà chúng tôi nhận được miễn phí bằng cách gán các lệnh cho các khoản mục. Cũng nhận thấy cách thức khá đơn giản là sử dụng các biểu tượng trên các mục trình đơn của ContextMenu.

Gọi ContextMenu từ Code-behind

Cho đến nay, ContextMenu đã được kích hoạt khi nhấp chuột phải trên bộ điều khiển mà nó thuộc. WPF thực hiện điều này cho chúng tôi tự động, khi chúng ta gán nó cho thuộc tính ContextMenu . Tuy nhiên, trong một số trường hợp, bạn có thể rất tốt muốn gọi nó theo cách thủ công từ mã. Điều này là khá dễ dàng là tốt, vì vậy hãy tái sử dụng ví dụ đầu tiên để chứng minh nó với:

<Window x:Class="WpfTutorialSamples.Common_interface_controls.ContextMenuManuallyInvokedSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ContextMenuManuallyInvokedSample" Height="250" Width="250">
    <Window.Resources>
        <ContextMenu x:Key="cmButton">
            <MenuItem Header="Menu item 1" />
            <MenuItem Header="Menu item 2" />
            <Separator />
            <MenuItem Header="Menu item 3" />
        </ContextMenu>
    </Window.Resources>
    <Grid>
        <Button Content="Click me!" VerticalAlignment="Center" HorizontalAlignment="Center" Click="Button_Click" />
    </Grid>
</Window>
using System;
using System.Windows;
using System.Windows.Controls;

namespace WpfTutorialSamples.Common_interface_controls
{
	public partial class ContextMenuManuallyInvokedSample : Window
	{
		public ContextMenuManuallyInvokedSample()
		{
			InitializeComponent();
		}

		private void Button_Click(object sender, RoutedEventArgs e)
		{
			ContextMenu cm = this.FindResource("cmButton") as ContextMenu;
			cm.PlacementTarget = sender as Button;
			cm.IsOpen = true;
		}
	}
}

Điều đầu tiên bạn nên thông báo là tôi đã chuyển ContextMenu từ nút. Thay vào đó, tôi đã thêm nó như là một nguồn tài nguyên của cửa sổ, để làm cho nó có sẵn từ tất cả ở khắp mọi nơi trong cửa sổ. Điều này cũng làm cho nó rất nhiều dễ dàng hơn để tìm thấy khi chúng ta cần để hiển thị nó.

Nút bây giờ có một xử lý sự kiện Click, tôi xử lý mã-đằng sau. Từ đó, tôi chỉ đơn giản là tìm thấy ví dụ ContextMenu trong các nguồn tài nguyên cửa sổ và sau đó tôi làm hai việc: tôi thiết lập của nó PlacementTarget bất động sản, mà nói với WPF yếu tố mà nó nên tính toán vị trí dựa trên, và sau đó tôi đặt IsOpen đúng sự thật, để mở trình đơn. Đó là tất cả các bạn cần!

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!