[C#/WPF] DynamicResource 태그 확장 : 정적 속성 값 사용하기
■ DynamicResource 태그 확장을 사용해 정적 속성 값을 참조하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 |
<Label Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionBrushKey}}"> Test </Label> |
■ DynamicResource 태그 확장을 사용해 정적 속성 값을 참조하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 |
<Label Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionBrushKey}}"> Test </Label> |
■ DynamicResource 엘리먼트를 사용해 정적 속성 값을 참조하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 11 |
... <Label.Foreground> <DynamicResource> <DynamicResource.ResourceKey> <x:Static Member="SystemColors.ActiveCaptionBrushKey" /> </DynamicResource.ResourceKey> </DynamicResource> </Label.Foreground> ... |
■ StaticResource 태그 확장을 사용해 리소스를 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib"> <StackPanel.Resources> <s:Double x:Key="FontSizeKey"> 20 </s:Double> </StackPanel.Resources> <Button HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10" FontSize="{StaticResource FontSizeKey}"> 테스트 </Button> </StackPanel> |
■ StaticResource 엘리먼트를 사용해 리소스를 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib"> <StackPanel.Resources> <s:Double x:Key="FontSizeKey"> 20 </s:Double> </StackPanel.Resources> <Button HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10"> <Button.FontSize> <StaticResource ResourceKey="FontSizeKey" /> </Button.FontSize> 테스트 </Button> </StackPanel> |
■ x:Static 엘리먼트를 사용해 SystemParameters 클래스의 CaptionHeight 정적 속성 값을 참조하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 |
<Button> <Button.Height> <x:Static Member="SystemParameters.CaptionHeight" /> </Button.Height> Test </Button> |
■ x:Static 태그 확장을 사용해 SystemParameters 클래스의 CaptionHeight 정적 속성 값을 참조하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 |
<Button Height="{x:Static SystemParameters.CaptionHeight}"> Test </Button> |
■ XAML 속성성 값 설정시 태그 확장 적용을 방지하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 |
<TextBlock xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" FontSize="20" Text="{}{just a little text in herel}" /> |
■ ResourceDictionary(또는 다른 프레임워크의 유사한 사전 개념)의 각 리소스에 대한 고유한 키를 설정하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 |
... <StackPanel.Resources> <s:Double x:Key="LargeFontSizeDoubleKey">18.7</s:Double> <s:Double x:Key="SmallFontSizeDoubleKey">14.7</s:Double> </StackPanel.Resources> ... |
■ XAML 속성 값 설정시 값의 단위를 설정하는 방법을 보여준다. ▶ 사용 가능 단위 (XAML)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
인치("in"), 센티미터("cm"), 포인트("pt"), 픽셀("px") Width="1.51in" Width="3.81cm" Width="108pt" ※ 단위는 대소문자 구분없이 사용 가능하다. ※ 값과 단위 사이 공백이 있어도 된다. Width="1.51 in" Width="3.81 cm" Width="108 pt" |
▶ 과학적 표기법 (XAML)
1 2 3 |
Width="15e-1in" |
▶
■ 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#)
1 2 3 4 5 6 7 8 9 |
<x:Code> <![CDATA[ // C# 코드가 기술된다. ]]> </x:Code> |
■ XAML 페이지에 대한 코드 숨김을 제공하는 클래스의 CLR 네임스페이스 및 클래스 이름을 지정한다. ▶ 예제 코드 (XAML)
1 2 3 |
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 타입을 등록하는 방법을 보여준다. ▶ 등록 정보
1 2 3 |
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#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#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#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 |