■ TextBox 클래스에서 탭 키를 누른 경우 탭 키 대신 공백 문자를 추가하는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System.Windows; using System.Windows.Controls; using System.Windows.Input; /// <summary> /// 텍스트 박스 /// </summary> private TextBox textBox; /// <summary> /// 탭 공백 수 /// </summary> private int tabSpaceCount = 4; #region 프리뷰 키 다운시 처리하기 - OnPreviewKeyDown(e) /// <summary> /// 프리뷰 키 다운시 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnPreviewKeyDown(KeyEventArgs e) { base.OnPreviewKeyDown(e); if(e.Source == this.textBox && e.Key == Key.Tab) { string insert = new string(' ', this.tabSpaceCount); int characterIndex = this.textBox.SelectionStart; int lineIndex = this.textBox.GetLineIndexFromCharacterIndex(characterIndex); if(lineIndex != -1) { int columnIndex = characterIndex - this.textBox.GetCharacterIndexFromLineIndex(lineIndex); insert = new string(' ', this.tabSpaceCount - columnIndex % this.tabSpaceCount); } this.textBox.SelectedText = insert; this.textBox.CaretIndex = this.textBox.SelectionStart + this.textBox.SelectionLength; e.Handled = true; } } #endregion |
■ TextBox 클래스의 GetCharacterIndexFromLineIndex 메소드를 사용해 현재 열의 인덱스를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
using System.Windows.Controls; #region 현재 열 구하기 - GetCurrentColumn(textBox) /// <summary> /// 현재 열 구하기 /// </summary> /// <param name="textBox">텍스트 박스</param> /// <returns>현재 열</returns> public int GetCurrentColumn(TextBox textBox) { int index = this.textBox.SelectionStart; int line = this.textBox.GetLineIndexFromCharacterIndex(index); int column = index - this.textBox.GetCharacterIndexFromLineIndex(line); return column; } #endregion |
■ TextBox 클래스의 GetLineIndexFromCharacterIndex 메소드를 사용해 현재 줄의 인덱스를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
using System.Windows.Controls; #region 현재 줄 구하기 - GetCurrentLine(textBox) /// <summary> /// 현재 줄 구하기 /// </summary> /// <param name="textBox">텍스트 박스</param> /// <returns>현재 줄</returns> public int GetCurrentLine(TextBox textBox) { int index = this.textBox.SelectionStart; int line = this.textBox.GetLineIndexFromCharacterIndex(index); return line; } #endregion |
■ x:Code 엘리먼트를 사용해 XAML에서 실행되는 C# 코드를 정의하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
<x:Code> <![CDATA[ // C# 코드가 기술된다. ]]> </x:Code> |
■ XAML 페이지에 대한 코드 숨김을 제공하는 클래스의 CLR 네임스페이스 및 클래스 이름을 지정한다. ▶ 예제 코드 (XAML)
|
x:Class="MyNamespace.MyClassName" |
■ XmlWriter 클래스의 Create/Save 정적 메소드를 사용해 FrameworkTemplate 객체에서 XAML을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System; using System.Text; using System.Windows; using System.Windows.Markup; using System.Xml; #region XAML 구하기 - GetXAML(template) /// <summary> /// XAML 구하기 /// </summary> /// <param name="template">프레임워크 템플리트</param> /// <returns>XAML</returns> public string GetXAML(FrameworkTemplate template) { XmlWriterSettings setting = new XmlWriterSettings(); setting.Indent = true; setting.IndentChars = new string(' ', 4); setting.NewLineOnAttributes = true; StringBuilder stringBuilder = new StringBuilder(); XmlWriter writer = XmlWriter.Create(stringBuilder, setting); try { XamlWriter.Save(template, writer); } catch(Exception) { return string.Empty; } return stringBuilder.ToString(); } #endregion |
■ XmlTextReader 클래스의 Load 메소드를 사용해 XAML에서 객체를 생성하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
using System; using System.Windows.Markup; using System.Xml; #region 객체 생성하기 - CreateObject(reader) /// <summary> /// 객체 생성하기 /// </summary> /// <param name="reader">XML 텍스트 리더</param> /// <returns>생성 객체</returns> public object CreateObject(XmlTextReader reader) { return XamlReader.Load(reader); } #endregion |
■ 웹 서버에서 .xaml 확장자 MIME 타입을 등록하는 방법을 보여준다. ▶ 등록 정보
|
AddType application/xaml+xml xaml |
※ 웹 서버상에서 .htaccess 파일에 다음과 같이 한
더 읽기
■ IValueConverter 인터페이스를 구현해 타입을 타입명 변환자를 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System; using System.Globalization; using System.Windows.Data; /// <summary> /// 타입→타입명 변환자 /// </summary> public class TypeToTypeNameConverter : IValueConverter { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 변환하기 - Convert(sourceValue, targetType, parameter, cultureInfo) /// <summary> /// 변환하기 /// </summary> /// <param name="sourceValue">소스 값</param> /// <param name="targetType">타겟 타입</param> /// <param name="parameter">매개 변수</param> /// <param name="cultureInfo">문화 정보</param> /// <returns>변환 값</returns> public object Convert(object sourceValue, Type targetType, object parameter, CultureInfo cultureInfo) { return (sourceValue as Type).Name; } #endregion #region 역변환하기 - ConvertBack(sourceValue, targetType, parameter, cultureInfo) /// <summary> /// 역변환하기 /// </summary> /// <param name="sourceValue">소스 값</param> /// <param name="targetType">타겟 타입</param> /// <param name="parameter">매개 변수</param> /// <param name="cultureInfo">문화 정보</param> /// <returns>역변환 값</returns> public object ConvertBack(object sourceValue, Type targetType, object parameter, CultureInfo cultureInfo) { return null; } #endregion } |
■ URI를 참조해 디스크 또는 네트워크에 저장된 이미지 파일의 특정 부분을 읽어서 비트맵 이미지를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System; using System.Windows; using System.Windows.Media.Imaging; #region 비트맵 이미지 구하기 - GetBitmapImage(uri, rectangle) /// <summary> /// 비트맵 이미지 구하기 /// </summary> /// <param name="uri">URI</param> /// <param name="rectangle">정수 사각형</param> /// <returns>비트맵 이미지</returns> public BitmapImage GetBitmapImage(Uri uri, Int32Rect rectangle) { BitmapImage bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.UriSource = uri; bitmapImage.SourceRect = rectangle; bitmapImage.EndInit(); return bitmapImage; } #endregion |
■ URI를 참조해 디스크 또는 네트워크에 저장된 이미지 파일을 읽어서 비트맵 이미지를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System; using System.Windows; using System.Windows.Media.Imaging; #region 비트맵 이미지 구하기 - GetBitmapImage(uri) /// <summary> /// 비트맵 이미지 구하기 /// </summary> /// <param name="uri">URI</param> /// <returns>비트맵 이미지</returns> public BitmapImage GetBitmapImage(Uri uri) { BitmapImage bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.UriSource = uri; bitmapImage.EndInit(); return bitmapImage; } #endregion |
■ RichTextBox 클래스에서 선택한 문자열의 폰트, 폰트 크기, 폰트 스타일 등을 구하는 방법을 보여준다. ▶ RichTextBox 클래스 : 선택 문자열의 속성값 구하기
더 읽기
■ FlowDocument 객체의 ContentStart/ContentEnd 속성을 갖고 생성한 TextRange 객체를 사용해 해당 범위의 문자열을 지우는 방법을 보여준다. ▶ 예제 코드 (C#)
|
#region FlowDocument 지우기 - ClearFlowDocument(flowDocument) /// <summary> /// FlowDocument 지우기 /// </summary> /// <param name="flowDocument">FlowDocument 객체</param> public void ClearFlowDocument(FlowDocument flowDocument) { TextRange textRange = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd); textRange = string.Empty; } #endregion |
■ RichTextBox 클래에서 선택한 문자열의 폰트, 크기, 스타일을 설정하는 방법을 보여준다. ▶ RichTextBox 클래스 : 선택 문자열의 속성값 설정하기 예제 (C#)
|
SetSelectionStringPropertyValue<FontFamily>(richTextBox, FlowDocument.FontFamilyProperty, fontFamily); SetSelectionStringPropertyValue<double>(richTextBox, FlowDocument.FontSizeProperty, fontSize); SetSelectionStringPropertyValue<FontWeight>(richTextBox, FlowDocument.FontWeightProperty, fontWeight); SetSelectionStringPropertyValue<FontStyle>(richTextBox, FlowDocument.FontStyleProperty, fontStyle); SetSelectionStringPropertyValue<Brush>(richTextBox, FlowDocument.BackgroundProperty, backgroundBrush); SetSelectionStringPropertyValue<Brush>(richTextBox, FlowDocument.ForegroundProperty, foregroundBrush); SetSelectionStringPropertyValue<TextAlignment>(richTextBox, FlowDocument.TextAlignmentProperty, textAlignment); |
더 읽기
■ DispatcherTimer 클래스의 Tick 이벤트를 사용해 미디어 플레이어의 재생 위치를 Slider 객체의 Value 속성에 설정하는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System.Windows.Controls; using System.Windows.Media; using System.Windows.Threading; private Slider slider; private MediaPlayer mediaPlayer; ... private DispatcherTimer dispatcherTimer = new DispatcherTimer(); ... this.DispatcherTimer.Interval = TimeSpan.FromSeconds(1); this.DispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); this.DispatcherTimer.Start(); ... #region 디스패처 타이머 틱 발생시 처리하기 - dispatcherTimer_Tick(sender, e) /// <summary> /// 디스패처 타이머 틱 발생시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private static void dispatcherTimer_Tick(object sender, EventArgs e) { this.slider.Value = this.mediaPlayer.Position.TotalSeconds; } #endregion |
■ Slider 클래스의 ValueChanged 이벤트를 사용해 MediaPlayer 객체의 Position 속성을 설정하는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System.Windows; using System.Windows.Media; using System.Windows.Controls; ... /// <summary> /// 미디어 플레이어 /// </summary> private MediaPlayer mediaPlayer; /// <summary> /// 슬라이더 /// </summary> private Slider slider; ... this.slider.Maximum = this.mediaPlayer.NaturalDuration.TimeSpan.TotalSeconds; this.slider.IsEnabled = true; this.slider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(slider_ValueChanged); ... #region 슬라이더 값 변경시 처리하기 - slider_ValueChanged(sender, e) /// <summary> /// 슬라이더 값 변경시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { this.mediaPlayer.Position = TimeSpan.FromSeconds(this.slider.Value); } #endregion |
■ MediaPlayer 클래스를 사용해 컴퓨터나 네트워크에 저장되어 있는 음악 파일을 재생하거나 일시 정지하거나 중단하는 방법을 보여준다. ▶ MediaPlayer 객체 생성하기 (C#)
|
using System.Windows.Media; MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.Open(uri); |
더 읽기
■ 피타고라스 법칙을 사용해 두 Point 객체 사이의 거리를 계산하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
using System; using System.Windows; #region 거리 구하기 - GetDistance(startPoint, endPoint) /// <summary> /// 거리 계산하기 /// </summary> /// <param name="startPoint">시작 위치</param> /// <param name="endPoint">종료 위치</param> /// <returns>거리</returns> public double GetDistance(Point startPoint, Point endPoint) { double deltaX = startPoint.X - endPoint.X; double deltaY = startPoint.Y - endPoint.Y; return Math.Sqrt((Math.Pow(Math.Abs(deltaX), 2) + Math.Pow(Math.Abs(deltaY), 2))); } #endregion |
■ 나선을 그리기 위한 좌표들을 계산해서 리스트로 반환하는 방법을 보여준다. ▶ 나선형(Spiral) Point 리스트 구하기 예제 (C#)
|
using System.Collections.Generic; using System.Windows; // 중심점 (300, 300), 반지름 100인 크기의 원에서 30도 간격으로 1440도를 회전하는 나선형 Point 리스트를 구한다. List<Point> spiralPointList = GetSpiralPointList(new Point(300d, 300d), 100d, 30d, 1440d); |
▶ 나선형(Spiral) Point 리스트
더 읽기
■ 원을 그리기 위한 좌표들을 계산해서 리스트로 반환하는 방법을 보여준다. ▶ 원형 Point 리스트 구하기 예제 (C#)
|
using System.Collections.Generic; using System.Windows; // 중심점 (300, 300), 반지름 100인 크기의 원에서 30도 간격의 원형 Point 리스트를 구한다. List<Point> circularPointList = GetCircularPointList(new Point(300d, 300d), 100d, 30d); |
▶ 원형 Point 리스트
더 읽기
■ N각형의 다각형 꼭지점 리스트를 구하는 방법을 보여준다. ▶ 다각형 꼭지점 리스트 구하기 예제 (C#)
|
using System.Collections.Generic; // 중심점 (300, 300), 반지름 100인 크기의 원에서 5각형 꼭지점 리스트를 구한다. List<DoublePoint> polygonVertexList = GetPolygonVertexList(new DoublPeoint(300d, 300d), 100d, 5); |
▶ 다각형 꼭지점 리스트 구하기 (C#)
더 읽기
■ TreeViewItem 클래스의 Expanded 이벤트와 TreeView 클래스의 MouseUp 이벤트를 사용해 트리뷰 노드 확장시 커서를 대기 커서로 표시하는 방법을 보여준다. ▶ 예제 코드
더 읽기
■ Environment 클래스의 OSVersion 정적 속성을 사용해 Windows 운영 체제 버전을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System; /// <summary> /// 운영 체제 타입 /// </summary> public enum OperatingSystemType { Unknown , Windows95 , Windows98 , WindowsMe , WindowsNT40 , WindowsNT2000 , WindowsXP , WindowsServer2003, WindowsVista , Windows7 } #region 운영 체제 타입 구하기 - GetOperatingSystemType() /// <summary> /// 운영 체제 타입 구하기 /// </summary> /// <returns>운영 체제 타입</returns> public OperatingSystemType GetOperatingSystemType() { OperatingSystem operatingSystem = Environment.OSVersion; OperatingSystemType operatingSystemType = OperatingSystemType.Unknown; switch(operatingSystem.Platform) { case PlatformID.Win32Windows : if(operatingSystem.Version.Major == 4) { switch(operatingSystem.Version.Minor) { case 0 : operatingSystemType = OperatingSystemType.Windows95; break; case 10 : operatingSystemType = OperatingSystemType.Windows98; break; case 90 : operatingSystemType = OperatingSystemType.WindowsMe; break; } } break; case PlatformID.Win32NT : if(operatingSystem.Version.Major == 4) { operatingSystemType = OperatingSystemType.WindowsNT40; } else if(operatingSystem.Version.Major == 5) { switch(operatingSystem.Version.Minor) { case 0 : operatingSystemType = OperatingSystemType.WindowsNT2000; break; case 1 : operatingSystemType = OperatingSystemType.WindowsXP; break; case 2 : operatingSystemType = OperatingSystemType.WindowsServer2003; break; } } else if(operatingSystem.Version.Major == 6) { switch(operatingSystem.Version.Minor) { case 0 : operatingSystemType = OperatingSystemType.WindowsVista; break; case 1 : operatingSystemType = OperatingSystemType.Windows7; break; } } break; } return operatingSystemType; } #endregion |
■ ManagedInstallerClass 클래스의 InstallHelper 정적 메소드를 사용해 윈도우즈 서비스를 설치하거나 제거하는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System; using System.IO; using System.Configuration.Install; #region 프로그램 실행하기 - Main(argumentArray) /// <summary> /// 프로그램 실행하기 /// </summary> /// <param name="argumentArray">인자 배열</param> private static void Main(string[] argumentArray) { if(argumentArray.Length <= 0) { Console.WriteLine("설치 : WindowsServiceInstaller.exe [filename]"); Console.WriteLine("제거 : WindowsServiceInstaller.exe [filename] /u"); } else if(!File.Exists(argumentArray[0])) { Console.WriteLine("파일을 찾을 수 없습니다."); } else if(argumentArray.Length >= 2 && argumentArray[1] == "/u") { try { // 등록된 서비스 제거 ManagedInstallerClass.InstallHelper(new string[] { "/u", argumentArray[0] }); Console.WriteLine("성공적으로 제거되었습니다."); } catch(Exception exception) { Console.WriteLine(exception.Message); } } else { try { // 서비스 등록 ManagedInstallerClass.InstallHelper(new string[] { argumentArray[0] }); Console.WriteLine("성공적으로 설치되었습니다."); } catch(Exception exception) { Console.WriteLine(exception.Message); } } Console.ReadKey(); } #endregion |
■ SystemParametersInfo WIN32 API 함수를 사용해 Form 객체를 트레이 상단에 위치시키는 방법을 보여준다. ▶ 예제 코드 (C#)
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
|
using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; /// <summary> /// 사각형 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct RECT { /// <summary> /// 왼쪽 /// </summary> public int Left; /// <summary> /// 위쪽 /// </summary> public int Top; /// <summary> /// 오른쪽 /// </summary> public int Right; /// <summary> /// 아래쪽 /// </summary> public int Bottom; } /// <summary> /// 시스템 파라미터 정보 구하기 /// </summary> /// <param name="action">작업</param> /// <param name="parameter">파라미터</param> /// <param name="rect">사각형</param> /// <param name="winINI">WIN.INI 업데이트 플래그</param> /// <returns>처리 결과</returns> [DllImport("user32", CharSet=CharSet.Auto, SetLastError=true)] public static extern int SystemParametersInfo(int action, int parameter, out RECT rect, int winINI); /// <summary> /// SPI_GETWORKAREA /// </summary> private const int SPI_GETWORKAREA = 0x0030; #region 위치 설정하기 - SetLocation(form) /// <summary> /// 위치 설정하기 /// </summary> /// <param name="form">Form 객체</param> public void SetLocation(Form form) { RECT rect = new RECT(); SystemParametersInfo(SPI_GETWORKAREA, 0, out rect, 0); Size size = form.Size; Point location = new Point(rect.Right - form.Width, rect.Bottom - size.Height); form.Location = location; } #endregion |