■ KeyGesture 클래스를 사용해 메뉴 단축키를 만드는 방법을 보여준다.
▶ MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="800" Height="600" Title="KeyGesture 클래스 : 메뉴 단축키 사용하기" FontFamily="나눔고딕코딩" FontSize="16"> <DockPanel> <Menu DockPanel.Dock="Top" Padding="5" FontSize="16"> <MenuItem Name="editMenuItem" Header="편집(_E)"> <MenuItem Name="cutMenuItem" Header="잘라내기(_T)" InputGestureText="Ctrl+X" /> <MenuItem Name="copyMenuItem" Header="복사하기(_C)" InputGestureText="Ctrl+C" /> <MenuItem Name="pasteMenuItem" Header="붙여넣기(_V)" InputGestureText="Ctrl+V" /> <MenuItem Name="deleteMenuItem" Header="삭제하기(_D)" InputGestureText="Delete" /> </MenuItem> </Menu> <TextBlock Name="textBlock" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap" FontSize="32" Text="샘플 클립보드 텍스트" /> </DockPanel> </Window> |
▶ MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 키 제스처 딕셔너리 /// </summary> Dictionary<KeyGesture, MenuItem> keyGestureDictionary = new Dictionary<KeyGesture, MenuItem>(); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); this.editMenuItem.SubmenuOpened += editMenuItem_SubmenuOpened; this.cutMenuItem.Click += cutMenuItem_Click; this.copyMenuItem.Click += copyMenuItem_Click; this.pasteMenuItem.Click += pasteMenuItem_Click; this.deleteMenuItem.Click += deleteMenuItem_Click; 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 ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 키 DOWN 사전 처리하기 - OnPreviewKeyDown(e) /// <summary> /// 키 DOWN 사전 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnPreviewKeyDown(KeyEventArgs e) { base.OnKeyDown(e); foreach(KeyGesture keyGesture in this.keyGestureDictionary.Keys) { if(keyGesture.Matches(null, e)) { e.Handled = true; this.keyGestureDictionary[keyGesture].RaiseEvent ( new RoutedEventArgs ( MenuItem.ClickEvent, this.keyGestureDictionary[keyGesture] ) ); } } } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #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 } } |