첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ KeyGesture 클래스 : 메뉴 단축키 사용하기

----------------------------------------------------------------------------------------------------

using System;

using System.Collections.Generic;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Input;

 

/// <summary>

/// 메인 윈도우

/// </summary>

public class MainWindow : Window

{

    //////////////////////////////////////////////////////////////////////////////////////////////////// Field

    ////////////////////////////////////////////////////////////////////////////////////////// Private

 

    #region Field

 

    /// <summary>

    /// 잘라내기 메뉴 항목

    /// </summary>

    private MenuItem cutMenuItem;

 

    /// <summary>

    /// 복사하기 메뉴 항목

    /// </summary>

    private MenuItem copyMenuItem;

 

    /// <summary>

    /// 붙여넣기 메뉴 항목

    /// </summary>

    private MenuItem pasteMenuItem;

 

    /// <summary>

    /// 삭제하기 메뉴 항목

    /// </summary>

    private MenuItem deleteMenuItem;

 

    /// <summary>

    /// 텍스트 블럭

    /// </summary>

    private TextBlock textBlock;

 

    /// <summary>

    /// 키 제스처 딕셔너리

    /// </summary>

    Dictionary<KeyGesture, MenuItem> keyGestureDictionary = new Dictionary<KeyGesture, MenuItem>();

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

    ////////////////////////////////////////////////////////////////////////////////////////// Public

 

    #region 생성자 - MainWindow()

 

    /// <summary>

    /// 생성자

    /// </summary>

    public MainWindow()

    {

        Title  = "잘라내기, 복사하기, 그리고 붙여넣기";

        Width  = 600;

        Height = 450;

 

 

        DockPanel dockPanel = new DockPanel();

 

        Content = dockPanel;

 

 

        Menu menu = new Menu();

 

        dockPanel.Children.Add(menu);

 

        DockPanel.SetDock(menu, Dock.Top);

 

 

        this.textBlock = new TextBlock();

 

        this.textBlock.Text                = "샘플 클립보드 텍스트";

        this.textBlock.HorizontalAlignment = HorizontalAlignment.Center;

        this.textBlock.VerticalAlignment   = VerticalAlignment.Center;

        this.textBlock.FontSize            = 32;

        this.textBlock.TextWrapping        = TextWrapping.Wrap;

 

        dockPanel.Children.Add(this.textBlock);

 

 

        MenuItem editMenuItem = new MenuItem();

 

        editMenuItem.Header = "_Edit";

 

        editMenuItem.SubmenuOpened += editMenuItem_SubmenuOpened;

 

        menu.Items.Add(editMenuItem);

 

 

        this.cutMenuItem = new MenuItem();

 

        this.cutMenuItem.Header           = "Cu_t";

        this.cutMenuItem.InputGestureText = "Ctrl+X";

 

        this.cutMenuItem.Click += cutMenuItem_Click;

 

        editMenuItem.Items.Add(this.cutMenuItem);

 

 

        this.copyMenuItem = new MenuItem();

 

        this.copyMenuItem.Header           = "_Copy";

        this.copyMenuItem.InputGestureText = "Ctrl+C";

 

        this.copyMenuItem.Click += copyMenuItem_Click;

 

        editMenuItem.Items.Add(this.copyMenuItem);

 

 

        this.pasteMenuItem = new MenuItem();

 

        this.pasteMenuItem.Header           = "_Paste";

        this.pasteMenuItem.InputGestureText = "Ctrl+V";

 

        this.pasteMenuItem.Click += pasteMenuItem_Click;

 

        editMenuItem.Items.Add(this.pasteMenuItem);

 

 

        this.deleteMenuItem = new MenuItem();

 

        this.deleteMenuItem.Header           = "_Delete";

        this.deleteMenuItem.InputGestureText = "Delete";

 

        this.deleteMenuItem.Click += deleteMenuItem_Click;

 

        editMenuItem.Items.Add(this.deleteMenuItem);

 

 

        this.keyGestureDictionary.Add(new KeyGesture(Key.X, ModifierKeys.Control), this.cutMenuItem   );

        this.keyGestureDictionary.Add(new KeyGesture(Key.C, ModifierKeys.Control), this.copyMenuItem  );

        this.keyGestureDictionary.Add(new KeyGesture(Key.V, ModifierKeys.Control), this.pasteMenuItem );

        this.keyGestureDictionary.Add(new KeyGesture(Key.Delete                 ), this.deleteMenuItem);

    }

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method

    ////////////////////////////////////////////////////////////////////////////////////////// Static

    //////////////////////////////////////////////////////////////////////////////// Private

 

    #region 프로그램 시작하기 - Main()

        

    /// <summary>

    /// 프로그램 시작하기

    /// </summary>

    [STAThread]

    private static void Main()

    {

        Application application = new Application();

 

        application.Run(new MainWindow());

    }

 

    #endregion

 

    ////////////////////////////////////////////////////////////////////////////////////////// Instance

    //////////////////////////////////////////////////////////////////////////////// Protected

 

    #region 키 DOWN 사전 처리하기 - OnPreviewKeyDown(e)

 

    /// <summary>

    /// 키 DOWN 사전 처리하기

    /// </summary>

    /// <param name="e">이벤트 인자</param>

    protected override void OnPreviewKeyDown(KeyEventArgs e)

    {

        base.OnKeyDown(e);

 

        e.Handled = true;

 

        foreach(KeyGesture keyGesture in this.keyGestureDictionary.Keys)

        {

            if(keyGesture.Matches(null, e))

            {

                this.keyGestureDictionary[keyGesture].RaiseEvent(new RoutedEventArgs(MenuItem.ClickEvent, this.keyGestureDictionary[keyGesture]));

            }

        }

    }

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////// Private

 

    #region 편집 메뉴 항목 하위 메뉴 오픈시 처리하기 - editMenuItem_SubmenuOpened(sender, e)

 

    /// <summary>

    /// 편집 메뉴 항목 하위 메뉴 오픈시 처리하기

    /// </summary>

    /// <param name="sender">이벤트 발생자</param>

    /// <param name="e">이벤트 인자</param>

    private void editMenuItem_SubmenuOpened(object sender, RoutedEventArgs e)

    {

        bool isEnabled = (this.textBlock.Text != null && this.textBlock.Text.Length > 0);

 

        this.cutMenuItem.IsEnabled    = isEnabled;

        this.copyMenuItem.IsEnabled   = isEnabled;

        this.pasteMenuItem.IsEnabled  = Clipboard.ContainsText();

        this.deleteMenuItem.IsEnabled = isEnabled;

    }

 

    #endregion

 

    #region 잘라내기 메뉴 항목 클릭시 처리하기 - cutMenuItem_Click(sender, e)

 

    /// <summary>

    /// 잘라내기 메뉴 항목 클릭시 처리하기

    /// </summary>

    /// <param name="sender">이벤트 발생자</param>

    /// <param name="e">이벤트 인자</param>

    protected void cutMenuItem_Click(object sender, RoutedEventArgs e)

    {

        copyMenuItem_Click(sender, e);

 

        deleteMenuItem_Click(sender, e);

    }

 

    #endregion

 

    #region 복사하기 메뉴 항목 클릭시 처리하기 - copyMenuItem_Click(sender, e)

 

    /// <summary>

    /// 복사하기 메뉴 항목 클릭시 처리하기

    /// </summary>

    /// <param name="sender">이벤트 발생자</param>

    /// <param name="e">이벤트 인자</param>

    protected void copyMenuItem_Click(object sender, RoutedEventArgs e)

    {

        if(this.textBlock.Text != null && this.textBlock.Text.Length > 0)

        {

            Clipboard.SetText(this.textBlock.Text);

        }

    }

 

    #endregion

 

    #region 붙여넣기 메뉴 항목 클릭시 처리하기 - pasteMenuItem_Click(sender, e)

 

    /// <summary>

    /// 붙여넣기 메뉴 항목 클릭시 처리하기

    /// </summary>

    /// <param name="sender">이벤트 발생자</param>

    /// <param name="e">이벤트 인자</param>

    protected void pasteMenuItem_Click(object sender, RoutedEventArgs e)

    {

        if(Clipboard.ContainsText())

        {

            this.textBlock.Text = Clipboard.GetText();

        }

    }

 

    #endregion

 

    #region 삭제하기 메뉴 항목 클릭시 처리하기 - deleteMenuItem_Click(sender, e)

 

    /// <summary>

    /// 삭제하기 메뉴 항목 클릭시 처리하기

    /// </summary>

    /// <param name="sender">이벤트 발생자</param>

    /// <param name="e">이벤트 인자</param>

    protected void deleteMenuItem_Click(object sender, RoutedEventArgs e)

    {

        this.textBlock.Text = null;

    }

 

    #endregion

}

----------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요