TOC

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

Common interface controls:

The WPF ContextMenu

팝업 매뉴라고도 불리우는 콘택스트 매뉴는 특정한 유저의 행동에 따라 표시되는 매뉴입니다. 대개 특정한 창 혹은 컨트롤에 마우스 오른쪽 클릭을 하였을 때 사용됩니다. 콘택스트 매뉴는 하나에 컨트롤 안에서 관련된 기능들을 제안하기 위해서 사용됩니다.

WPF는 특정한 컨트롤에 거의 묶여있다시피 한 ContextMenu 컨트롤과 함께 사용되며 많은 경우에 당신도 이 방법을 사용하여 인터페이스에 추가할 것입니다. 이것은 모든 컨트롤이 노출하는 ContextProperty (거의 모든 WPF 컨트롤이 상속하는 FrameworkElement에서 옵니다.)를 통해 행하여집니다. 다음 예시로 어떻게 작동하는지 확인하세요:

<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>

만약 당신이 이미 일반적인 메뉴에 대한 챕터를 읽었다면, 일반적인 매뉴와 ContextMenu는 정확하게 같은 방식으로 작동한다는 것으르 알아챘을 것입니다. 이것은 이 둘 모두 MenuBase 클래스를 상속하기 때문입니다. 일반 매뉴 사용법에서 보았던 예시들처럼, 당연하게도 유저가 이것들을 클릭하였을때의 작동을 설정하기 위한 클릭 이벤트를 추가할 수 있습니다. 하지만 WPF에 더욱 적절한 방법은 Commands를 사용하는 것입니다.

ContextMenu with Commands and icons

다음 예제에서는 Context Menu를 사용할 때 두 가지 주요 개념을 보여드리겠습니다: WPF Command의 사용은 더 많은 것을 제공합니다. 클릭 이벤트 핸들러, 텍스트 및 바로 가기 텍스트를 포함한 기능을 Command 속성에 할당하기만 하면 됩니다. 상황에 맞는 메뉴 항목에 아이콘 사용을 보여드리겠습니다.

<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>

예제를 실행해 보고 항목에 명령을 할당하여 얼마나 많은 기능을 자유롭게 사용할 수 있는지 직접 확인하십시오. 또한 ContextMenu의 메뉴 항목에 있는 아이콘을 사용하는 것도 매우 간단합니다.

Invoke ContextMenu from Code-behind

지금까지 ContextMenu는 해당 컨트롤이 속한 컨트롤을 마우스 오른쪽 버튼으로 클릭할 때 호출되었습니다. WPF는 ContextMenu 속성 할당 시 자동으로 이 작업을 수행합니다. 그러나 경우에 따라 코드에서 수동으로 호출해야 할 수도 있습니다. 이 작업은 매우 쉬우므로 첫 번째 예제를 다시 사용하여 다음과 같이 시연해 보겠습니다.

<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;
		}
	}
}

먼저 ContextMenu 를 버튼에서 다른 위치로 이동했습니다. 대신 창 내의 모든 위치에서 사용할 수 있도록 창의 리소스로 추가했습니다. 이것은 우리가 그것을 보여줘야 할 때 훨씬 더 쉽게 찾을 수 있게 해줍니다.

이제 버튼에 클릭 이벤트 핸들러가 있으며, 이 핸들러는 Code-behind에서 처리합니다. 여기서 창 리소스에서 ContextMenu 인스턴스를 찾은 다음 두 가지 작업을 수행합니다. WPF에서 어떤 요소를 기준으로 위치를 계산해야 하는지 알려주는 PlacementTarget 속성을 설정한 다음 IsOpen을 true로 설정하여 메뉴를 엽니다. 당신이 해야 할 건 이게 전부입니다!


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!