728x90
728x170
■ TextBox 엘리먼트의 ContextMenu 속성을 사용해 커스텀 컨텍스트 메뉴를 만드는 방법을 보여준다.
▶ MainWindow.xaml
<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="TestProject"
FontFamily="나눔고딕코딩"
FontSize="16">
<TextBox Name="textBox"
Margin="10"
AcceptsReturn="True"
AcceptsTab="True"
VerticalScrollBarVisibility="Visible"
TextWrapping="Wrap">
<TextBox.ContextMenu>
<ContextMenu Name="contextMenu">
<MenuItem Name="cutMenuItem"
Header="Cut" />
<MenuItem Name="copyMenuItem"
Header="Copy" />
<MenuItem Name="pasteMenuItem"
Header="Paste" />
<Separator/>
<MenuItem Name="selectAllMenuItem"
Header="Select All" />
<MenuItem Name="selectLineMenuItem"
Header="Select Current Line" />
<Separator />
<MenuItem Name="undoMenuItem"
Header="Undo Last Action" />
<MenuItem Name="redoMenuItem"
Header="Redo Last Action" />
<Separator />
<MenuItem Name="clearMenuItem"
Header="Clear All Text" />
</ContextMenu>
</TextBox.ContextMenu>
This TextBox uses a simple custom context menu. The context menu can be disabled by checking
the CheckBox above, which simply sets the TextBox.ContextMenu property to null.
</TextBox>
</Window>
▶ MainWindow.xaml.cs
using System.Windows;
namespace TestProject
{
/// <summary>
/// 메인 윈도우
/// </summary>
public partial class MainWindow : Window
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainWindow()
/// <summary>
/// 생성자
/// </summary>
public MainWindow()
{
InitializeComponent();
this.contextMenu.Opened += contextMenu_Opened;
this.cutMenuItem.Click += cutMenuItem_Click;
this.copyMenuItem.Click += copyMenuItem_Click;
this.pasteMenuItem.Click += pasteMenuItem_Click;
this.selectAllMenuItem.Click += selectAllMenuItem_Click;
this.selectLineMenuItem.Click += selectLineMenuItem_Click;
this.undoMenuItem.Click += undoMenuItem_Click;
this.redoMenuItem.Click += redoMenuItem_Click;
this.clearMenuItem.Click += clearMenuItem_Click;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 컨텍스트 메뉴 오픈시 처리하기 - contextMenu_Opened(sender, e)
/// <summary>
/// 컨텍스트 메뉴 오픈시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void contextMenu_Opened(object sender, RoutedEventArgs e)
{
if(this.textBox.SelectedText == string.Empty)
{
this.copyMenuItem.IsEnabled = this.cutMenuItem.IsEnabled = false;
}
else
{
this.copyMenuItem.IsEnabled = this.cutMenuItem.IsEnabled = true;
}
if(Clipboard.ContainsText())
{
this.pasteMenuItem.IsEnabled = true;
}
else
{
this.pasteMenuItem.IsEnabled = false;
}
}
#endregion
#region Cut 메뉴 항목 클릭시 처리하기 - cutMenuItem_Click(sender, e)
/// <summary>
/// Cut 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void cutMenuItem_Click(object sender, RoutedEventArgs e)
{
this.textBox.Cut();
}
#endregion
#region Copy 메뉴 항목 클릭시 처리하기 - copyMenuItem_Click(sender, e)
/// <summary>
/// Copy 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void copyMenuItem_Click(object sender, RoutedEventArgs e)
{
this.textBox.Copy();
}
#endregion
#region Paste 메뉴 항목 클릭시 처리하기 - pasteMenuItem_Click(sender, e)
/// <summary>
/// Paste 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void pasteMenuItem_Click(object sender, RoutedEventArgs e)
{
this.textBox.Paste();
}
#endregion
#region Select All 메뉴 항목 클릭시 처리하기 - selectAllMenuItem_Click(sender, e)
/// <summary>
/// Select All 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void selectAllMenuItem_Click(object sender, RoutedEventArgs e)
{
this.textBox.SelectAll();
}
#endregion
#region Select Line 메뉴 항목 클릭시 처리하기 - selectLineMenuItem_Click(sender, e)
/// <summary>
/// Select Line 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void selectLineMenuItem_Click(object sender, RoutedEventArgs e)
{
int lineIndex = this.textBox.GetLineIndexFromCharacterIndex(this.textBox.CaretIndex);
int characterIndex = this.textBox.GetCharacterIndexFromLineIndex(lineIndex);
int lineLength = this.textBox.GetLineLength(lineIndex);
this.textBox.Select(characterIndex, lineLength);
}
#endregion
#region Undo 메뉴 항목 클릭시 처리하기 - undoMenuItem_Click(sender, e)
/// <summary>
/// Undo 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void undoMenuItem_Click(object sender, RoutedEventArgs e)
{
this.textBox.Undo();
}
#endregion
#region Redo 메뉴 항목 클릭시 처리하기 - redoMenuItem_Click(sender, e)
/// <summary>
/// Redo 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void redoMenuItem_Click(object sender, RoutedEventArgs e)
{
this.textBox.Redo();
}
#endregion
#region Clear 메뉴 항목 클릭시 처리하기 - clearMenuItem_Click(sender, e)
/// <summary>
/// Clear 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void clearMenuItem_Click(object sender, RoutedEventArgs e)
{
this.textBox.Clear();
}
#endregion
}
}
728x90
그리드형(광고전용)
'C# > WPF' 카테고리의 다른 글
[C#/WPF] HierarchicalDataTemplate 엘리먼트 : DataType 속성을 사용해 트리 만들기 (0) | 2023.01.20 |
---|---|
[C#/WPF] ToolTipService 엘리먼트 : 툴팁 표시하기 (0) | 2023.01.19 |
[C#/WPF] ToolTip 엘리먼트 : Placement/PlacementRectangle 속성 사용하기 (0) | 2023.01.19 |
[C#/WPF] ToolBar 엘리먼트 : 내부 컨트롤 스타일 설정하기 (0) | 2023.01.19 |
[C#/WPF] ToolBar 엘리먼트 : OverflowMode 첨부 속성 사용하기 (0) | 2023.01.18 |
[C#/WPF] Slider 엘리먼트 : Ticks 속성을 사용해 사용자 눈금 설정하기 (0) | 2023.01.17 |
[C#/WPF] ScrollViewer 클래스 : 컨텐츠 스크롤 메소드 사용하기 (0) | 2023.01.17 |
[C#/WPF] ScrollViewer 엘리먼트 : CanContentScroll 속성과 IScrollInfo 인터페이스를 사용해 컨텐츠 스크롤하기 (0) | 2023.01.17 |
[C#/WPF] ScrollViewer 클래스 : ScrollChanged 이벤트 사용하기 (0) | 2023.01.17 |
[C#/WPF] ControlTemplate 엘리먼트 : 고정 크기 썸을 갖는 ScrollBar 엘리먼트 정의하기 (0) | 2023.01.17 |