방법: 명령을 지원하는 컨트롤에 명령 후크

다음 예제는 RoutedCommand를 명령에 대한 지원을 기본 제공하는 Control에 후크하는 방법을 보여줍니다. 여러 소스에 명령을 후크하는 전체 샘플은 Create a Custom RoutedCommand Sample(사용자 지정 RoutedCommand 만들기 샘플)을 참조하세요.

예제

WPF(Windows Presentation Foundation)는 애플리케이션 프로그래머가 자주 접하게 되는 공용 명령의 라이브러리를 제공합니다. 명령 라이브러리를 구성하는 클래스는 ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsEditingCommands입니다.

이러한 클래스를 구성하는 정적 RoutedCommand 개체는 명령 논리를 제공하지 않습니다. 명령 논리는 CommandBinding이 있는 명령과 연결됩니다. 일부 컨트롤에는 일부 명령에 대한 CommandBindings가 기본 제공되어 있습니다. 이 메커니즘을 사용하면 명령의 의미 체계를 동일하게 유지하면서 실제 구현을 변경할 수 있습니다. 예를 들어 TextBox는 이미지를 지원하도록 설계된 컨트롤과 다르게 Paste 명령을 처리하지만 붙여넣는 것의 의미에 대한 기본 개념은 동일하게 유지됩니다. 명령 논리는 명령에 의해 제공될 수 없으나 대신 컨트롤 또는 애플리케이션에 의해 제공되어야 합니다.

WPF의 많은 컨트롤은 명령 라이브러리의 일부 명령에 대한 지원을 기본 제공합니다. 예를 들어 TextBoxPaste, Copy, Cut, RedoUndo 등의 많은 애플리케이션 편집 명령을 지원합니다. 애플리케이션 개발자는 이러한 명령을 컨트롤과 함께 사용하기 위해 별도로 해야 하는 작업은 없습니다. 명령이 실행될 때 TextBox가 명령 대상인 경우는 컨트롤에 내장되어 있는 CommandBinding을 사용하여 명령을 처리할 수 있습니다.

다음은 TextBox가 명령 대상인 Paste 명령에 대한 명령 소스로 MenuItem을 사용하는 방법을 표시합니다. TextBox가 붙여넣기를 수행하는 방법을 정의하는 모든 논리가 TextBox 컨트롤에 기본 제공됩니다.

MenuItem이 만들어지고 Command 속성이 Paste 명령으로 설정됩니다. CommandTarget이 명시적으로 TextBox 개체로 설정되지 않습니다. CommandTarget이 설정되지 않는 경우 명령의 대상은 키보드 포커스가 있는 요소입니다. 키보드 포커스가 있는 요소가 Paste 명령을 지원하지 않거나 현재 붙여넣기 명령을 실행할 수 없는 경우(예를 들어 클립보드가 비어있는 경우) MenuItem이 회색으로 표시됩니다.

<Window x:Class="SDKSamples.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MenuItemCommandTask"
    >
    <DockPanel>
      <Menu DockPanel.Dock="Top">
        <MenuItem Command="ApplicationCommands.Paste" Width="75" />
      </Menu>
      <TextBox BorderBrush="Black" BorderThickness="2" Margin="25"
               TextWrapping="Wrap">
        The MenuItem will not be enabled until
        this TextBox gets keyboard focus  
      </TextBox>
    </DockPanel>
</Window>
// Window1 constructor
public Window1()
{
    InitializeComponent();

    // Instantiating UIElements.
    DockPanel mainPanel = new DockPanel();
    Menu mainMenu = new Menu();
    MenuItem pasteMenuItem = new MenuItem();
    TextBox mainTextBox = new TextBox();

    // Associating the MenuItem with the Paste command.
    pasteMenuItem.Command = ApplicationCommands.Paste;

    // Setting properties on the TextBox.
    mainTextBox.Text =
        "The MenuItem will not be enabled until this TextBox receives keyboard focus.";
    mainTextBox.Margin = new Thickness(25);
    mainTextBox.BorderBrush = Brushes.Black;
    mainTextBox.BorderThickness = new Thickness(2);
    mainTextBox.TextWrapping = TextWrapping.Wrap;

    // Attaching UIElements to the Window.
    this.AddChild(mainPanel);
    mainMenu.Items.Add(pasteMenuItem);
    mainPanel.Children.Add(mainMenu);
    mainPanel.Children.Add(mainTextBox);

    // Defining DockPanel layout.
    DockPanel.SetDock(mainMenu, Dock.Top);
    DockPanel.SetDock(mainTextBox, Dock.Bottom);
}
' Window1 constructor
Public Sub New()
    InitializeComponent()

    ' Instantiating UIElements.
    Dim mainPanel As New DockPanel()
    Dim mainMenu As New Menu()
    Dim pasteMenuItem As New MenuItem()
    Dim mainTextBox As New TextBox()

    ' Associating the MenuItem with the Paste command.
    pasteMenuItem.Command = ApplicationCommands.Paste

    ' Setting properties on the TextBox.
    mainTextBox.Text = "The MenuItem will not be enabled until this TextBox receives keyboard focus."
    mainTextBox.Margin = New Thickness(25)
    mainTextBox.BorderBrush = Brushes.Black
    mainTextBox.BorderThickness = New Thickness(2)
    mainTextBox.TextWrapping = TextWrapping.Wrap

    ' Attaching UIElements to the Window.
    Me.AddChild(mainPanel)
    mainMenu.Items.Add(pasteMenuItem)
    mainPanel.Children.Add(mainMenu)
    mainPanel.Children.Add(mainTextBox)

    ' Defining DockPanel layout.
    DockPanel.SetDock(mainMenu, Dock.Top)
    DockPanel.SetDock(mainTextBox, Dock.Bottom)
End Sub

참고 항목