Share via


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

다음 예제에서는 명령을 기본적으로 지원하는 ControlRoutedCommand를 후크하는 방법을 보여 줍니다. 여러 소스에 명령을 후크하는 방법을 보여 주는 전체 샘플은 Create a Custom RoutedCommand 샘플을 참조하십시오.

예제

Windows Presentation Foundation (WPF)은 응용 프로그램 프로그래머가 흔히 사용하는 일반 명령이 포함된 라이브러리를 제공합니다. 이 명령 라이브러리를 구성하는 클래스는 ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsEditingCommands입니다.

이러한 클래스를 구성하는 정적 RoutedCommand 개체는 명령 논리를 제공하지 않습니다. 명령 논리는 CommandBinding을 통해 명령에 연결됩니다. 일부 컨트롤에서는 경우 일부 명령에 대한 CommandBinding을 기본 제공합니다. 이 메커니즘을 통해 명령의 의미는 동일하게 유지하면서 실제 구현의 변경은 허용할 수 있습니다. 예를 들어 TextBoxPaste 이미지를 지원하기 위해 디자인된 컨트롤과 다르게 명령을 처리하지만, 무언가를 붙여 넣는다는 의미에 대한 기본 개념은 동일하게 유지됩니다. 명령 논리는 명령에 의해 제공될 수 없으며 컨트롤 또는 응용 프로그램에서 제공해야 합니다.

WPF에서 제공하는 많은 컨트롤은 명령 라이브러리의 일부 명령을 기본적으로 지원합니다. 예를 들어 TextBoxPaste, Copy, Cut, RedoUndo와 같은 대부분의 응용 프로그램 편집 명령을 지원합니다. 따라서 응용 프로그램 개발자는 컨트롤에서 이러한 명령이 작동하도록 하기 위해 특별한 작업을 수행할 필요가 없습니다. 명령이 실행될 때 명령 대상이 TextBox인 경우 컨트롤에 기본적으로 제공된 CommandBinding을 사용하여 명령을 처리합니다.

다음에서는 TextBox가 명령의 대상일 때 MenuItemPaste 명령의 명령 소스로 사용하는 방법을 보여 줍니다. TextBox가 붙여넣기를 수행하는 방법을 정의하는 모든 논리는 TextBox 컨트롤에 내장됩니다.

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

<Window x:Class="SDKSamples.Window1"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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 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
// 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);
}

참고 항목

작업

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

개념

명령 개요