■ GroupStyle 엘리먼트 : HeaderTemplate 속성을 사용해 ListBox 객체에서 그룹 스타일을 설정하는 방법을 보여준다. ▶ 예제 코드 (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
|
... <ListBox Name="listBox"> <ListBox.ItemTemplate> ... </ListBox.ItemTemplate> <ListBox.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate> <TextBlock Margin="6" Foreground="White" Background="DarkGray" FontWeight="Bold" FontSize="12pt" Text="{Binding Path=Name}" /> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </ListBox.GroupStyle> </ListBox> ... |
▶ 예제 코드
더 읽기
■ ItemsControl 클래스에서 항목을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
using System.Windows.Controls; #region 항목 구하기 - GetItem<TItem>(itemsControl, itemIndex) /// <summary> /// 항목 구하기 /// </summary> /// <typeparam name="TItem">항목 타입</typeparam> /// <param name="itemsControl">ItemsControl 객체</param> /// <param name="itemIndex">항목 인덱스</param> /// <returns>항목 객체</returns> public TItem GetItem<TItem>(ItemsControl itemsControl, int itemIndex) where TItem : class { return itemsControl.ItemContainerGenerator.ContainerFromItem(itemsControl.Items[itemIndex]) as TItem; } #endregion |
■ Button 클래스의 SetResourceReference 메소드를 사용해 리소스를 설정하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Windows.Controls; ... Button button; ... button.SetResourceReference(Button.StyleProperty, "RedForegroundStyleKey"); |
※ 찾고자 하는 리소스가 존재하지 않는 경우
더 읽기
■ FrameworkElement 클래스의 TryFindResource 메소드를 사용해 리소스를 찾는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Windows; Style style = this.button.TryFindResource("RedForegroundStyleKey") as Style; if(style != null) { this.button.Style = style; } |
※ 찾고자 하는 리소스가 존재하지 않는 경우
더 읽기
■ FrameworkElement 클래스의 FindResource 메소드를 사용해 리소스를 찾는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
using System.Windows; Style style = null; try { style = this.button.FindResource("RedForegroundStyleKey") as Style; } catch { } if(style != null) { this.button.Style = style; } |
※ 찾고자 하는 리소스가 존재하지 않는 경우
더 읽기
■ VisualTreeHelper 클래스를 사용해 특정 타입의 비주얼을 찾는 방법을 보여준다. ▶ 예제 코드 (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
|
using System.Windows; using System.Windows.Media; #region 비주얼 찾기 - FindVisual<T>(source) /// <summary> /// 비주얼 찾기 /// </summary> /// <typeparam name="T">비주얼 타입</typeparam> /// <param name="source">소스 의존 객체</param> /// <returns>비주얼</returns> public TVisual FindVisual<TVisual>(DependencyObject source) where TVisual : class { if(source is TVisual) { return source as TVisual; } for(int i = 0; i < VisualTreeHelper.GetChildrenCount(source); i++) { TVisual child = FindVisual<TVisual>(VisualTreeHelper.GetChild(source, i)); if(child != null) { return child; } } return null; } #endregion |
■ FlowDocumentScrollViewer 엘리먼트를 사용하는 기본적인 방법을 보여준다. ▶ 예제 코드 (XAML)
|
<FlowDocumentScrollViewer> <FlowDocument> ... </FlowDocument> </FlowDocumentScrollViewer> |
■ DockPanel 엘리먼트에서 사용하는 기본적인 방법을 보여준다. ▶ 예제 코드 (XAML)
|
<DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" LastChildFill="True"> <TextBox DockPanel.Dock="Top">Dock = "Top"</TextBox> <TextBox DockPanel.Dock="Bottom">Dock = "Bottom"</TextBox> <TextBox DockPanel.Dock="Left">Dock = "Left"</TextBox> <TextBox Background="White">This TextBox "fills" the remaining space.</TextBox> </DockPanel> |
■ BlockUIContainer 엘리먼트를 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
<FlowDocument> ... <BlockUIContainer> <Polygon Points="144 48, 200 222, 53 114, 235 114, 88 222" Stroke="Blue" StrokeThickness="5"> <Polygon.Fill> <LinearGradientBrush StartPoint="0 0" EndPoint="1 0"> <GradientStopCollection> <GradientStop Offset="0" Color="Red" /> <GradientStop Offset="0.5" Color="Green" /> <GradientStop Offset="1" Color="BLue" /> </GradientStopCollection> </LinearGradientBrush> </Polygon.Fill> </Polygon> </BlockUIContainer> ... </FlowDocument> |
※ BlockUIContainer 엘리먼트는 UIElement 타입 객체를 포함할 수 있다.
■ FlowDocumentReader 엘리먼트를 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="프로그램 개요"> <FlowDocumentReader> <FlowDocument> <Paragraph Style="{StaticResource Header}">Program Overview</Paragraph> <Paragraph>This file presents an overview of the program.</Paragraph> <Paragraph> The description is probably several paragraphs in length. Perhaps it makes reference to the <Hyperlink NavigateUri="FileMenu.xaml">File Menu</Hyperlink> and <Hyperlink NavigateUri="HelpMenu.xaml">Help Menu</Hyperlink>. </Paragraph> </FlowDocument> </FlowDocumentReader> </Page> |
■ InkCanvas 객체의 데이터를 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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
using System.IO; using System.Windows.Controls; using System.Windows.Ink; using System.Windows.Markup; using System.Windows.Media; #region XAML 데이터 저장하기 - SaveXAMLData(inkCanvas, filePath) /// <summary> /// XAML 데이터 저장하기 /// </summary> /// <param name="inkCanvas">InkCanvas 객체</param> /// <param name="filePath">파일 경로</param> public void SaveXAMLData(InkCanvas inkCanvas, string filePath) { FileStream stream = null; try { stream = new FileStream(filePath, FileMode.Create, FileAccess.Write); DrawingGroup drawingGroup = new DrawingGroup(); foreach(Stroke stroke in inkCanvas.Strokes) { Color color = stroke.DrawingAttributes.Color; if(stroke.DrawingAttributes.IsHighlighter) { color = Color.FromArgb(128, color.R, color.G, color.B); } drawingGroup.Children.Add ( new GeometryDrawing ( new SolidColorBrush(color), null, stroke.GetGeometry() ) ); } XamlWriter.Save(drawingGroup, stream); } finally { if(stream != null) { stream.Close(); } } } #endregion |
■ InkCanvas 클래스의 Strokes 속성을 사용해 ISF 데이터를 파일에 저장하는 방법을 보여준다. ▶ 예제 코드 (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
|
using System.IO; using System.Windows.Controls; #region 데이터 저장하기 - SaveISFData(inkCanvas, filePath) /// <summary> /// 데이터 저장하기 /// </summary> /// <param name="inkCanvas">InkCanvas 객체</param> /// <param name="filePath">파일 경로</param> public void SaveISFData(InkCanvas inkCanvas, string filePath) { FileStream fileStream = null; try { fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write); inkCanvas.Strokes.Save(fileStream); } finally { if(fileStream != null) { fileStream.Close(); } } } #endregion |
■ 파일에서 데이터를 로드하고 InkCanvas 클래스의 Strokes 속성에 값을 설정하는 방법을 보여준다. ▶ 예제 코드 (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
|
using System.IO; using System.Windows.Controls; #region 데이터 로드하기 - LoadData(inkCanvas, filePath) /// <summary> /// 데이터 로드하기 /// </summary> /// <param name="inkCanvas">InkCanvas 객체</param> /// <param name="filePath">파일 경로</param> public void LoadData(InkCanvas inkCanvas, string filePath) { FileStream fileStream = null; try { fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); inkCanvas.Strokes = new StrokeCollection(fileStream); } finally { if(fileStream != null) { fileStream.Close(); } } } #endregion |
■ 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 |
■ RichTextBox 클래스에서 선택한 문자열의 폰트, 폰트 크기, 폰트 스타일 등을 구하는 방법을 보여준다. ▶ RichTextBox 클래스 : 선택 문자열의 속성값 구하기
더 읽기
■ 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); |
더 읽기
■ TreeViewItem 클래스의 Expanded 이벤트와 TreeView 클래스의 MouseUp 이벤트를 사용해 트리뷰 노드 확장시 커서를 대기 커서로 표시하는 방법을 보여준다. ▶ 예제 코드
더 읽기
■ 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 |
■ Form 클래스의 CheckForIllegalCrossThreadCalls 정적 속성을 사용해 크로스 스레드 예외 발생을 방지하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Windows.Forms; Form.CheckForIllegalCrossThreadCalls = false; |
■ 웹 브라우저에서 로드된 HTML 문서 내 자바스크립트 함수를 호출하는 코드를 보여준다. ▶ 실행 코드 (JAVASCRIPT)
|
<script> var _value = "테스트"; function GetValue() { return _value; } </script> |
▶ 실행 코드 (C#)
|
using System.Windows.Forms; WebBrowser webBrowser = new WebBrowser(); string value = webBrowser.Document.InvokeScript("GetValue").ToString(); MessageBox.Show(value); |