명령 개요Commanding Overview

명령은 디바이스 입력보다 더 의미 있는 수준의 입력 처리를 제공하는 WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF)의 입력 메커니즘입니다.Commanding is an input mechanism in WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) which provides input handling at a more semantic level than device input. 이러한 명령의 예로는 많은 애플리케이션의 복사, 잘라내기붙여넣기 작업을 들 수 있습니다.Examples of commands are the Copy, Cut, and Paste operations found on many applications.

이 개요에서는 WPFWPF의 명령, 명령 모델의 일부인 클래스 및 애플리케이션에서 명령을 사용하고 만드는 방법을 정의합니다.This overview defines what commands are in WPFWPF, which classes are part of the commanding model, and how to use and create commands in your applications.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.This topic contains the following sections:

명령이란?What Are Commands?

명령의 목적에는 몇 가지가 있습니다.Commands have several purposes. 첫 번째 목적은 명령을 실행하는 논리에서 명령을 호출하는 개체와 의미 체계를 분리하는 것입니다.The first purpose is to separate the semantics and the object that invokes a command from the logic that executes the command. 이렇게 하면 여러 소스에서 동일한 명령 논리를 호출할 수 있고 명령 논리가 여러 대상에 대해 사용자 지정될 수 있습니다.This allows for multiple and disparate sources to invoke the same command logic, and it allows the command logic to be customized for different targets. 예를 들어 다양한 사용자 작업이 명령을 사용하여 구현된 경우 이러한 작업을 사용하여 많은 애플리케이션에 사용되는 편집 작업인 복사, 잘라내기붙여넣기를 호출할 수 있습니다.For example, the editing operations Copy, Cut, and Paste, which are found in many applications, can be invoked by using different user actions if they are implemented by using commands. 애플리케이션에서 단추를 클릭하거나, 메뉴에서 항목을 선택하거나, Ctrl+X 등의 키 조합을 사용하여 사용자가 선택한 개체 또는 텍스트를 잘라낼 수 있습니다.An application might allow a user to cut selected objects or text by either clicking a button, choosing an item in a menu, or using a key combination, such as CTRL+X. 명령을 사용하여 각 사용자 작업 형식을 동일한 논리에 바인딩할 수 있습니다.By using commands, you can bind each type of user action to the same logic.

명령의 또 다른 목적은 작업을 사용할 수 있는지 여부를 나타내는 것입니다.Another purpose of commands is to indicate whether an action is available. 개체 또는 텍스트 잘라내기의 경우 항목을 선택했을 때만 의미를 갖습니다.To continue the example of cutting an object or text, the action only makes sense when something is selected. 사용자가 아무것도 선택하지 않고 개체 또는 텍스트를 잘라내려고 하면 작업이 수행되지 않습니다.If a user tries to cut an object or text without having anything selected, nothing would happen. 많은 애플리케이션에서는 사용자가 작업 수행 가능 여부를 알 수 있도록 단추 및 메뉴 항목을 사용하지 않도록 설정합니다.To indicate this to the user, many applications disable buttons and menu items so that the user knows whether it is possible to perform an action. 명령은 CanExecute 메서드를 구현하여 작업이 가능한지 여부를 나타낼 수 있습니다.A command can indicate whether an action is possible by implementing the CanExecute method. 단추는 CanExecuteChanged 이벤트를 구독할 수 있으며 CanExecutefalse로 반환되는 경우 비활성화되고 CanExecutetrue로 반환되는 경우 활성화됩니다.A button can subscribe to the CanExecuteChanged event and be disabled if CanExecute returns false or be enabled if CanExecute returns true.

명령의 의미 체계는 모든 애플리케이션 및 클래스에서 일관적일 수 있지만 작업의 논리는 수행된 특정 개체에 따라 다릅니다.The semantics of a command can be consistent across applications and classes, but the logic of the action is specific to the particular object acted upon. 텍스트 클래스, 이미지 클래스 및 웹 브라우저에서 Ctrl+X 키 조합을 사용하면 Cut 명령이 호출되지만 잘라내기 작업을 수행하는 실제 논리는 잘라내기를 수행하는 애플리케이션에 의해 정의됩니다.The key combination CTRL+X invokes the Cut command in text classes, image classes, and Web browsers, but the actual logic for performing the Cut operation is defined by the application that performs the cut. RoutedCommand가 클라이언트를 사용하여 논리를 구현합니다.A RoutedCommand enables clients to implement the logic. 텍스트 개체는 선택한 텍스트를 클립보드로 잘라낼 수 있지만 이미지 개체는 선택한 이미지를 잘라낼 수 있습니다.A text object may cut the selected text into the clipboard, while an image object may cut the selected image. 애플리케이션에서 Executed 이벤트를 처리할 때 명령 대상에 대한 액세스 권한이 있어야 대상의 형식에 따라 적절한 작업을 수행할 수 있습니다.When an application handles the Executed event, it has access to the target of the command and can take appropriate action depending on the target's type.

WPF의 간단한 명령 예제Simple Command Example in WPF

WPFWPF에서 명령을 사용하는 가장 간단한 방법은 명령 라이브러리 클래스 중 하나에서 미리 정의된 RoutedCommand를 사용하거나, 명령 처리 및 명령 호출을 기본적으로 지원하는 컨트롤을 사용하는 것입니다.The simplest way to use a command in WPFWPF is to use a predefined RoutedCommand from one of the command library classes; use a control that has native support for handling the command; and use a control that has native support for invoking a command. Paste 명령은 ApplicationCommands 클래스에서 미리 정의된 명령 중 하나입니다.The Paste command is one of the predefined commands in the ApplicationCommands class. TextBox 컨트롤은 Paste 명령을 처리하기 위한 논리를 기본 제공합니다.The TextBox control has built in logic for handling the Paste command. MenuItem 클래스는 명령 호출을 기본적으로 지원합니다.And the MenuItem class has native support for invoking commands.

다음 예제에서는 MenuItem을 설정하는 방법을 보여줘 클릭하는 경우 Paste에 키보드 포커스가 있다는 가정 하에 TextBox에서 TextBox 명령을 호출합니다.The following example shows how to set up a MenuItem so that when it is clicked it will invoke the Paste command on a TextBox, assuming the TextBox has keyboard focus.

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste" />
  </Menu>
  <TextBox />
</StackPanel>
  // Creating the UI objects
  StackPanel mainStackPanel = new StackPanel();
  TextBox pasteTextBox = new TextBox();
  Menu stackPanelMenu = new Menu();
  MenuItem pasteMenuItem = new MenuItem();
 
  // Adding objects to the panel and the menu
  stackPanelMenu.Items.Add(pasteMenuItem);
  mainStackPanel.Children.Add(stackPanelMenu);
  mainStackPanel.Children.Add(pasteTextBox);

  // Setting the command to the Paste command
  pasteMenuItem.Command = ApplicationCommands.Paste;

  // Setting the command target to the TextBox
  pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As New MenuItem()

' Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem)
mainStackPanel.Children.Add(stackPanelMenu)
mainStackPanel.Children.Add(pasteTextBox)

' Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste

WPF 명령의 네 가지 주요 개념Four Main Concepts in WPF Commanding

WPFWPF의 라우트된 명령 모델은 명령, 명령 소스, 명령 대상 및 명령 바인딩 네 가지 주요 개념으로 나눌 수 있습니다.The routed command model in WPFWPF can be broken up into four main concepts: the command, the command source, the command target, and the command binding:

  • 명령은 실행할 작업입니다.The command is the action to be executed.

  • 명령 소스는 명령을 호출하는 개체입니다.The command source is the object which invokes the command.

  • 명령 대상은 명령이 실행되는 개체입니다.The command target is the object that the command is being executed on.

  • 명령 바인딩은 명령 논리를 명령에 매핑하는 개체입니다.The command binding is the object which maps the command logic to the command.

이전 예제에서 Paste 명령은 명령이며, MenuItem은 명령 원본이며, TextBox는 명령 대상이며, 명령 바인딩은 TextBox 컨트롤에 의해 제공됩니다.In the previous example, the Paste command is the command, the MenuItem is the command source, the TextBox is the command target, and the command binding is supplied by the TextBox control. CommandBinding이 항상 명령 대상 클래스인 컨트롤에 의해 제공되는 것은 아닙니다.It is worth noting that it is not always the case that the CommandBinding is supplied by the control that is the command target class. 매우 자주 CommandBinding은 애플리케이션 개발자에 의해 만들어져야 하거나, CommandBinding은 명령 대상의 상위 항목에 연결될 수 있습니다.Quite often the CommandBinding must be created by the application developer, or the CommandBinding might be attached to an ancestor of the command target.

CommandsCommands

WPFWPF에서 명령은 ICommand 인터페이스를 구현하여 만듭니다.Commands in WPFWPF are created by implementing the ICommand interface. ICommand는 두 개의 메서드 Execute, CanExecute 및 하나의 이벤트 CanExecuteChanged를 노출합니다.ICommand exposes two methods, Execute, and CanExecute, and an event, CanExecuteChanged. Execute는 명령과 연결되는 작업을 수행합니다.Execute performs the actions that are associated with the command. CanExecute는 현재 명령 대상에서 명령을 실행할 수 있는지 여부를 결정합니다.CanExecute determines whether the command can execute on the current command target. 명령 작업을 중앙 집중식으로 관리하는 명령 관리자가, 발생했지만 명령 바인딩에서 아직 실행하지 않은 명령을 무효화할 수 있는 변경 사항을 명령 소스에서 감지한 경우 CanExecuteChanged가 발생합니다.CanExecuteChanged is raised if the command manager that centralizes the commanding operations detects a change in the command source that might invalidate a command that has been raised but not yet executed by the command binding. WPFWPFICommand 구현은 RoutedCommand 클래스이며 이 개요의 포커스입니다.The WPFWPF implementation of ICommand is the RoutedCommand class and is the focus of this overview.

WPFWPF의 주 입력 소스는 마우스, 키보드, 잉크 및 라우트된 명령입니다.The main sources of input in WPFWPF are the mouse, the keyboard, ink, and routed commands. 더 많은 디바이스 지향 입력이 RoutedEvent를 사용하여 애플리케이션 페이지의 개체에 입력 이벤트가 발생했음을 알립니다.The more device-oriented inputs use a RoutedEvent to notify objects in an application page that an input event has occurred. RoutedCommand도 마찬가지입니다.A RoutedCommand is no different. ExecuteCanExecuteRoutedCommand 메서드는 명령에 대한 애플리케이션 논리를 포함하지 않지만 CommandBinding이 있는 개체를 찾을 때까지 요소 트리를 통해 터널링 및 버블링하는 라우팅된 이벤트를 발생시킵니다.The Execute and CanExecute methods of a RoutedCommand do not contain the application logic for the command, but rather they raise routed events that tunnel and bubble through the element tree until they encounter an object with a CommandBinding. CommandBinding에는 이러한 이벤트에 대한 처리기가 포함되어 있으며 이는 명령을 수행하는 처리기입니다.The CommandBinding contains the handlers for these events and it is the handlers that perform the command. WPFWPF의 이벤트 라우팅에 대한 자세한 내용은 라우트된 이벤트 개요를 참조하세요.For more information on event routing in WPFWPF, see Routed Events Overview.

ExecuteRoutedCommand 메서드는 명령 대상에서 PreviewExecutedExecuted 이벤트를 발생시킵니다.The Execute method on a RoutedCommand raises the PreviewExecuted and the Executed events on the command target. CanExecuteRoutedCommand 메서드는 명령 대상에서 CanExecutePreviewCanExecute 이벤트를 발생시킵니다.The CanExecute method on a RoutedCommand raises the CanExecute and PreviewCanExecute events on the command target. 이러한 이벤트는 특정 명령에 대한 CommandBinding이 있는 개체를 찾을 때까지 요소 트리를 통해 터널링 및 버블링합니다.These events tunnel and bubble through the element tree until they encounter an object which has a CommandBinding for that particular command.

WPFWPF는 여러 클래스에 분산된 라우팅된 일반적인 명령 집합, MediaCommands, ApplicationCommands, NavigationCommands, ComponentCommandsEditingCommands를 공급합니다.supplies a set of common routed commands spread across several classes: MediaCommands, ApplicationCommands, NavigationCommands, ComponentCommands, and EditingCommands. 이러한 클래스는 RoutedCommand 개체로만 구성되며 명령의 구현 논리는 포함되지 않습니다.These classes consist only of the RoutedCommand objects and not the implementation logic of the command. 구현 논리는 명령이 실행 중인 개체에서 제공해야 합니다.The implementation logic is the responsibility of the object on which the command is being executed on.

명령 소스Command Sources

명령 소스는 명령을 호출하는 개체입니다.A command source is the object which invokes the command. 명령 소스의 예는 MenuItem, ButtonKeyGesture입니다.Examples of command sources are MenuItem, Button, and KeyGesture.

WPFWPF의 명령 소스는 일반적으로 ICommandSource 인터페이스를 구현합니다.Command sources in WPFWPF generally implement the ICommandSource interface.

ICommandSourceCommand, CommandTargetCommandParameter의 세 가지 속성을 노출합니다.ICommandSource exposes three properties: Command, CommandTarget, and CommandParameter:

WPFWPF를 구현하는 ICommandSource 클래스는 ButtonBase, MenuItem, HyperlinkInputBinding입니다.The WPFWPF classes that implement ICommandSource are ButtonBase, MenuItem, Hyperlink, and InputBinding. ButtonBase, MenuItemHyperlink는 클릭할 때 명령을 호출하며, InputBinding은 이와 연결된 InputGesture가 수행될 때 명령을 호출합니다.ButtonBase, MenuItem, and Hyperlink invoke a command when they are clicked, and an InputBinding invokes a command when the InputGesture associated with it is performed.

다음 예제에서는 MenuItem 명령에 대한 명령 소스로 ContextMenu에서 Properties을 사용하는 방법을 표시합니다.The following example shows how to use a MenuItem in a ContextMenu as a command source for the Properties command.

<StackPanel>
  <StackPanel.ContextMenu>
    <ContextMenu>
      <MenuItem Command="ApplicationCommands.Properties" />
    </ContextMenu>
  </StackPanel.ContextMenu>
</StackPanel>
StackPanel cmdSourcePanel = new StackPanel();
ContextMenu cmdSourceContextMenu = new ContextMenu();
MenuItem cmdSourceMenuItem = new MenuItem();

// Add ContextMenu to the StackPanel.
cmdSourcePanel.ContextMenu = cmdSourceContextMenu;
cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem);

// Associate Command with MenuItem.
cmdSourceMenuItem.Command = ApplicationCommands.Properties;
Dim cmdSourcePanel As New StackPanel()
Dim cmdSourceContextMenu As New ContextMenu()
Dim cmdSourceMenuItem As New MenuItem()

' Add ContextMenu to the StackPanel.
cmdSourcePanel.ContextMenu = cmdSourceContextMenu
cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem)

' Associate Command with MenuItem.
cmdSourceMenuItem.Command = ApplicationCommands.Properties

일반적으로 명령 소스는 CanExecuteChanged 이벤트에 수신됩니다.Typically, a command source will listen to the CanExecuteChanged event. 이 이벤트는 현재 명령 대상에서 명령을 실행할 수 있는 기능이 변경되었을 수 있음을 명령 소스에 알립니다.This event informs the command source that the ability of the command to execute on the current command target may have changed. 명령 소스는 RoutedCommand 메서드를 사용하여 CanExecute의 현재 상태를 쿼리할 수 있습니다.The command source can query the current status of the RoutedCommand by using the CanExecute method. 명령을 실행할 수 없는 경우 명령 소스는 자체적으로 사용하지 않도록 설정될 수 있습니다.The command source can then disable itself if the command cannot execute. 예를 들어 명령을 실행할 수 없는 경우 MenuItem은 자체적으로 회색으로 표시됩니다.An example of this is a MenuItem graying itself out when a command cannot execute.

InputGesture는 명령 소스로 사용할 수 있습니다.An InputGesture can be used as a command source. WPFWPF의 두 가지 형식의 입력 제스처는 KeyGestureMouseGesture입니다.Two types of input gestures in WPFWPF are the KeyGesture and MouseGesture. CTRL+C 같은 키보드 바로 가기 키로 KeyGesture를 생각할 수 있습니다.You can think of a KeyGesture as a keyboard shortcut, such as CTRL+C. KeyGestureKeyModifierKeys의 집합으로 이뤄져 있습니다.A KeyGesture is comprised of a Key and a set of ModifierKeys. MouseGestureMouseActionModifierKeys의 선택적 집합으로 이뤄져 있습니다.A MouseGesture is comprised of a MouseAction and an optional set of ModifierKeys.

InputGesture를 명령 소스로 사용하려면 명령과 연결되어야 합니다.In order for an InputGesture to act as a command source, it must be associated with a command. 이 작업을 수행하는 방법은 몇 가지가 있습니다.There are a few ways to accomplish this. 한 가지 방법은 InputBinding을 사용하는 것입니다.One way is to use an InputBinding.

다음 예제에서는 KeyBindingKeyGesture 간에 RoutedCommand을 만드는 방법을 보여 줍니다.The following example shows how to create a KeyBinding between a KeyGesture and a RoutedCommand.

<Window.InputBindings>
  <KeyBinding Key="B"
              Modifiers="Control" 
              Command="ApplicationCommands.Open" />
</Window.InputBindings>
KeyGesture OpenKeyGesture = new KeyGesture(
    Key.B,
    ModifierKeys.Control);

KeyBinding OpenCmdKeybinding = new KeyBinding(
    ApplicationCommands.Open,
    OpenKeyGesture);

this.InputBindings.Add(OpenCmdKeybinding);
Dim OpenKeyGesture As New KeyGesture(Key.B, ModifierKeys.Control)

Dim OpenCmdKeybinding As New KeyBinding(ApplicationCommands.Open, OpenKeyGesture)

Me.InputBindings.Add(OpenCmdKeybinding)

InputGestureRoutedCommand에 연결하는 다른 방법은 InputGesture에서 InputGestureCollectionRoutedCommand에 추가하는 것입니다.Another way to associate an InputGesture to a RoutedCommand is to add the InputGesture to the InputGestureCollection on the RoutedCommand.

다음 예제에서는 KeyGestureInputGestureCollectionRoutedCommand를 추가하는 방법을 보여 줍니다.The following example shows how to add a KeyGesture to the InputGestureCollection of a RoutedCommand.

KeyGesture OpenCmdKeyGesture = new KeyGesture(
    Key.B,
    ModifierKeys.Control);

ApplicationCommands.Open.InputGestures.Add(OpenCmdKeyGesture);
Dim OpenCmdKeyGesture As New KeyGesture(Key.B, ModifierKeys.Control)

ApplicationCommands.Open.InputGestures.Add(OpenCmdKeyGesture)

CommandBindingCommandBinding

CommandBinding은 명령을 구현하는 이벤트 처리기와 명령을 연결합니다.A CommandBinding associates a command with the event handlers that implement the command.

CommandBinding 클래스에는 Command 속성과 PreviewExecuted, Executed, PreviewCanExecuteCanExecute 이벤트가 포함됩니다.The CommandBinding class contains a Command property, and PreviewExecuted, Executed, PreviewCanExecute, and CanExecute events.

CommandCommandBinding이 연결되어 있는 명령입니다.Command is the command that the CommandBinding is being associated with. PreviewExecutedExecuted 이벤트에 연결되는 이벤트 처리기는 명령 논리를 구현합니다.The event handlers which are attached to the PreviewExecuted and Executed events implement the command logic. PreviewCanExecuteCanExecute 이벤트에 연결된 이벤트 처리기는 현재 명령 대상에서 명령을 실행할 수 있는지 결정합니다.The event handlers attached to the PreviewCanExecute and CanExecute events determine if the command can execute on the current command target.

다음 예제에서는 애플리케이션의 루트 CommandBinding에서 Window을 만드는 방법을 보여 줍니다.The following example shows how to create a CommandBinding on the root Window of an application. CommandBindingOpen 명령을 ExecutedCanExecute 처리기와 연결합니다.The CommandBinding associates the Open command with Executed and CanExecute handlers.

<Window.CommandBindings>
  <CommandBinding Command="ApplicationCommands.Open"
                  Executed="OpenCmdExecuted"
                  CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
// Creating CommandBinding and attaching an Executed and CanExecute handler
CommandBinding OpenCmdBinding = new CommandBinding(
    ApplicationCommands.Open,
    OpenCmdExecuted,
    OpenCmdCanExecute);

this.CommandBindings.Add(OpenCmdBinding);
' Creating CommandBinding and attaching an Executed and CanExecute handler
Dim OpenCmdBinding As New CommandBinding(ApplicationCommands.Open, AddressOf OpenCmdExecuted, AddressOf OpenCmdCanExecute)

Me.CommandBindings.Add(OpenCmdBinding)

다음으로, ExecutedRoutedEventHandlerCanExecuteRoutedEventHandler를 만듭니다.Next, the ExecutedRoutedEventHandler and a CanExecuteRoutedEventHandler are created. ExecutedRoutedEventHandlerMessageBox를 열어 명령이 실행됐다는 문자열을 표시합니다.The ExecutedRoutedEventHandler opens a MessageBox that displays a string saying the command has been executed. CanExecuteRoutedEventHandlerCanExecute 속성을 true로 설정합니다.The CanExecuteRoutedEventHandler sets the CanExecute property to true.

void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
    String command, targetobj;
    command = ((RoutedCommand)e.Command).Name;
    targetobj = ((FrameworkElement)target).Name;
    MessageBox.Show("The " + command +  " command has been invoked on target object " + targetobj);
}
Private Sub OpenCmdExecuted(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
    Dim command, targetobj As String
    command = CType(e.Command, RoutedCommand).Name
    targetobj = CType(sender, FrameworkElement).Name
    MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj)
End Sub
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;
}
Private Sub OpenCmdCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
    e.CanExecute = True
End Sub

CommandBinding은 애플리케이션 또는 컨트롤의 루트 Window 같은 특정 개체에 연결됩니다.A CommandBinding is attached to a specific object, such as the root Window of the application or a control. CommandBinding이 연결된 개체는 바인딩의 범위를 정의합니다.The object that the CommandBinding is attached to defines the scope of the binding. 예를 들어 명령 대상의 상위 항목에 연결된 CommandBindingExecuted 이벤트로 연결할 수 있지만 명령 대상의 하위 항목에 연결된 CommandBinding은 연결할 수 없습니다.For example, a CommandBinding attached to an ancestor of the command target can be reached by the Executed event, but a CommandBinding attached to a descendant of the command target cannot be reached. 이는 이벤트를 발생시키는 개체에서 RoutedEvent를 터널링 및 버블링할 때 발생하는 직접적인 결과입니다.This is a direct consequence of the way a RoutedEvent tunnels and bubbles from the object that raises the event.

일부 경우에 CommandBindingTextBox 클래스와 Cut, CopyPaste 명령 같은 명령 대상 자체에 연결됩니다.In some situations the CommandBinding is attached to the command target itself, such as with the TextBox class and the Cut, Copy, and Paste commands. 그러나 CommandBinding을 주 Window 또는 애플리케이션 개체와 같은 명령 대상의 상위 항목에 연결하는 것이 더 편리할 때가 종종 있습니다. 특히 동일한 CommandBinding을 여러 명령 대상에 대해 사용할 수 있는 경우 그렇습니다.Quite often though, it is more convenient to attach the CommandBinding to an ancestor of the command target, such as the main Window or the Application object, especially if the same CommandBinding can be used for multiple command targets. 명령 인프라를 만들 때 이러한 디자인 사항을 결정해야 합니다.These are design decisions you will want to consider when you are creating your commanding infrastructure.

명령 대상Command Target

명령 대상은 명령이 실행되는 요소입니다.The command target is the element on which the command is executed. RoutedCommand와 관련하여 명령 대상은 ExecutedCanExecute의 라우팅이 시작하는 요소입니다.With regards to a RoutedCommand, the command target is the element at which routing of the Executed and CanExecute starts. 앞서 지적한 것처럼 WPFWPF에서 CommandTargetICommandSource 속성은 ICommandRoutedCommand인 경우에만 적용 가능합니다.As noted previously, in WPFWPF the CommandTarget property on ICommandSource is only applicable when the ICommand is a RoutedCommand. CommandTargetICommandSource에서 설정되고 해당 명령이 RoutedCommand가 아닌 경우 명령 대상은 무시됩니다.If the CommandTarget is set on an ICommandSource and the corresponding command is not a RoutedCommand, the command target is ignored.

명령 소스는 명령 대상을 명시적으로 설정할 수 있습니다.The command source can explicitly set the command target. 명령 대상이 정의되지 않은 경우 키보드 포커스가 있는 요소가 명령 대상으로 사용됩니다.If the command target is not defined, the element with keyboard focus will be used as the command target. 키보드 포커스가 있는 요소를 명령 대상으로 사용하면 애플리케이션 개발자가 명령 대상을 추적하지 않고도 동일한 명령 소스를 사용하여 여러 대상에서 명령을 호출할 수 있다는 장점이 있습니다.One of the benefits of using the element with keyboard focus as the command target is that it allows the application developer to use the same command source to invoke a command on multiple targets without having to keep track of the command target. 예를 들어 MenuItem컨트롤 및 컨트롤이 있는 애플리케이션에서 TextBox붙여넣기PasswordBox 명령을 호출하는 경우 대상은 키보드 포커스가 있는 컨트롤에 따라 TextBox 또는 PasswordBox일 수 있습니다.For example, if a MenuItem invokes the Paste command in an application that has a TextBox control and a PasswordBox control, the target can be either the TextBox or PasswordBox depending on which control has keyboard focus.

다음 예제에서는 태그 및 코드 숨김에서 명령 대상을 명시적으로 설정하는 방법을 보여 줍니다.The following example shows how to explicitly set the command target in markup and in code behind.

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste"
              CommandTarget="{Binding ElementName=mainTextBox}" />
  </Menu>
  <TextBox Name="mainTextBox"/>
</StackPanel>
  // Creating the UI objects
  StackPanel mainStackPanel = new StackPanel();
  TextBox pasteTextBox = new TextBox();
  Menu stackPanelMenu = new Menu();
  MenuItem pasteMenuItem = new MenuItem();
 
  // Adding objects to the panel and the menu
  stackPanelMenu.Items.Add(pasteMenuItem);
  mainStackPanel.Children.Add(stackPanelMenu);
  mainStackPanel.Children.Add(pasteTextBox);

  // Setting the command to the Paste command
  pasteMenuItem.Command = ApplicationCommands.Paste;

  // Setting the command target to the TextBox
  pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As New MenuItem()

' Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem)
mainStackPanel.Children.Add(stackPanelMenu)
mainStackPanel.Children.Add(pasteTextBox)

' Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste

CommandManagerThe CommandManager

CommandManager는 여러 명령 관련 함수를 제공합니다.The CommandManager serves a number of command related functions. 특정 요소에 PreviewExecuted, Executed, PreviewCanExecuteCanExecute 이벤트 처리기를 추가하고 제거하기 위한 정적 메서드 집합을 제공합니다.It provides a set of static methods for adding and removing PreviewExecuted, Executed, PreviewCanExecute, and CanExecute event handlers to and from a specific element. 특정 클래스에 CommandBindingInputBinding 개체를 등록하기 위한 수단을 제공합니다.It provides a means to register CommandBinding and InputBinding objects onto a specific class. CommandManagerRequerySuggested 이벤트를 통해 CanExecuteChanged 이벤트가 발행할 경우 명령을 알리기 위한 수단을 제공합니다.The CommandManager also provides a means, through the RequerySuggested event, to notify a command when it should raise the CanExecuteChanged event.

InvalidateRequerySuggested 메서드는 CommandManagerRequerySuggested 이벤트를 발생시키도록 합니다.The InvalidateRequerySuggested method forces the CommandManager to raise the RequerySuggested event. 이는 명령을 사용 또는 사용하지 않도록 설정해야 하지만 CommandManager가 인식하는 조건이 아닌 경우에 유용합니다.This is useful for conditions that should disable/enable a command but are not conditions that the CommandManager is aware of.

명령 라이브러리Command Library

WPFWPF는 미리 정의된 명령 집합을 제공합니다.provides a set of predefined commands. 명령 라이브러리는 다음과 같은 ApplicationCommands, NavigationCommands, MediaCommands, EditingCommandsComponentCommands 클래스로 구성됩니다.The command library consists of the following classes: ApplicationCommands, NavigationCommands, MediaCommands, EditingCommands, and the ComponentCommands. 이러한 클래스는 Cut, BrowseBackBrowseForward, Play, StopPause 같은 명령을 제공합니다.These classes provide commands such as Cut, BrowseBack and BrowseForward, Play, Stop, and Pause.

이 중 많은 명령이 기본 입력 바인딩 집합을 포함합니다.Many of these commands include a set of default input bindings. 예를 들어 응용 프로그램에서 복사 명령을 처리 하도록 지정 하는 경우 자동으로 키보드 바인딩 "CTRL + C"가 표시 되 고, Tablet PC 펜 제스처 및 음성 정보와 같은 다른 입력 장치에 대 한 바인딩도 표시 됩니다.For example, if you specify that your application handles the copy command, you automatically get the keyboard binding "CTRL+C" You also get bindings for other input devices, such as Tablet PC pen gestures and speech information.

XAMLXAML을 사용하여 다양한 명령 라이브러리에서 명령을 참조할 때 일반적으로 정적 명령 특성을 노출하는 라이브러리 클래스의 클래스 이름을 생략할 수 있습니다.When you reference commands in the various command libraries using XAMLXAML, you can usually omit the class name of the library class that exposes the static command property. 일반적으로 명령 이름은 문자열처럼 명확하지 않으며 명령의 논리적 그룹화를 제공하기 위한 소유 유형이 존재하지만 명확성을 위해 반드시 필요하지는 않습니다.Generally, the command names are unambiguous as strings, and the owning types exist to provide a logical grouping of commands but are not necessary for disambiguation. 예를 들어 더 자세한 Command="Cut" 대신 Command="ApplicationCommands.Cut"을 지정할 수 있습니다.For instance, you can specify Command="Cut" rather than the more verbose Command="ApplicationCommands.Cut". 이는 명령의 WPFWPF XAMLXAML 프로세서에 기본 제공된 편리한 메커니즘입니다. 더 자세히 말해, ICommand WPFWPF 프로세서가 로드 시 참조하는 XAMLXAML의 형식 변환기 동작입니다.This is a convenience mechanism that is built in to the WPFWPF XAMLXAML processor for commands (more precisely, it is a type converter behavior of ICommand, which the WPFWPF XAMLXAML processor references at load time).

사용자 지정 명령 만들기Creating Custom Commands

명령 라이브러리 클래스의 명령이 사용자 요구 사항을 충족시키지 못하면 사용자가 직접 명령을 만들 수 있습니다.If the commands in the command library classes do not meet your needs, then you can create your own commands. 두 가지 방법으로 사용자 지정 명령을 만들 수 있습니다.There are two ways to create a custom command. 첫 번째 방법은 처음부터 시작하여 ICommand 인터페이스를 구현하는 것입니다.The first is to start from the ground up and implement the ICommand interface. 다른 방식이자 보다 일반적인 방식은 RoutedCommand 또는 RoutedUICommand를 만드는 것입니다.The other way, and the more common approach, is to create a RoutedCommand or a RoutedUICommand.

사용자 지정 RoutedCommand를 만드는 예제는 사용자 지정 RoutedCommand 샘플 만들기를 참조하세요.For an example of creating a custom RoutedCommand, see Create a Custom RoutedCommand Sample.

참고 항목See also