■ Style 엘리먼트의 TargetType 속성을 사용해 버튼 스타일을 설정하는 방법을 보여준다. ▶ 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
|
<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="Style 엘리먼트 : TargetType 속성을 사용해 버튼 스타일 설정하기" FontFamily="나눔고딕코딩" FontSize="16"> <Window.Resources> <Style TargetType="{x:Type Button}"> <Setter Property="Margin" Value="10" /> <Setter Property="FontSize" Value="24" /> <Setter Property="Foreground" Value="Blue" /> </Style> </Window.Resources> <Grid> <Button HorizontalAlignment="Center" VerticalAlignment="Center" Padding="10" Content="테스트" /> </Grid> </Window> |
※ x:Type 태그 확장을 사용하지 않아도 된다. ※
더 읽기
■ Setter 엘리먼트의 Value 속성 값으로 NULL 값을 설정하는 방법을 보여준다. ▶ 예제 코드 (XAML)
|
<Setter Property="Control.Foreground" Value="{x:Null}" /> |
■ Setter 엘리먼트를 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
|
<Setter Property="Button.FontSize" Value="18pt" /> |
※ Property 특성은 항상 의존 프로퍼티를 참조하지만 상기 프로퍼티는 FontSizeProperty가 아닌
더 읽기
■ Style 엘리먼트를 사용하는 기본적인 방법을 보여준다. ▶ 예제 코드 (XAML)
|
<Style> <Setter Property="Button.FontSize" Value="18pt" /> <Setter Property="Control.Foreground" Value="Blue" /> </Style> |
■ 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> |
■ Binding 객체의 UpdateSourceTrigger 속성을 UpdateSourceTrigger.Explicit로 설정시 BindingExpression 클래스의 UpdateSource 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (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
|
using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Data; ScrollBar sourceScrollBar; Label targetLabel; ... Binding binding = new Binding(); binding.Source = sourceScrollBar; binding.Path = new PropertyPath(ScrollBar.ValueProperty); binding.Mode = BindingMode.OneWay; binding.UpdateSourceTrigger = UpdateSourceTrigger.Explicit; targetLabel.SetBinding(Label.ContentProperty, binding); ... BindingExpression bindingExpression = targetLabel.GetBindingExpression(Label.ContentProperty); bindingExpression.UpdateSource(); |
■ Binding 클래스를 사용해 특정 엘리먼트 속성을 바인딩하는 방법을 보여준다. ▶ DoubleToDecimalValueConveter.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
|
using System; using System.Globalization; using System.Windows.Data; namespace TestProject { /// <summary> /// 실수↔10진수 값 변환자 /// </summary> [ValueConversion(typeof(double), typeof(decimal))] public class DoubleToDecimalValueConverter : 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">CultureInfo</param> /// <returns>변환 값</returns> public object Convert(object sourceValue, Type targetType, object parameter, CultureInfo cultureInfo) { decimal targetValue = new decimal((double)sourceValue); if(parameter != null) { targetValue = decimal.Round(targetValue, int.Parse(parameter as string)); } return targetValue; } #endregion #region 역변환하기 - ConvertBack(sourceValue, targetType, parameter, cultureInfo) /// <summary> /// 역변환하기 /// </summary> /// <param name="sourceValue">소스 값</param> /// <param name="targetType">타겟 타입</param> /// <param name="parameter">파라미터</param> /// <param name="cultureInfo">CultureInfo</param> /// <returns>역변환 값</returns> public object ConvertBack(object sourceValue, Type targetType, object parameter, CultureInfo cultureInfo) { return decimal.ToDouble((decimal)sourceValue); } #endregion } } |
▶ 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
|
<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="Binding 엘리먼트 : ElementName 속성을 사용해 특정 엘리먼트 속성 바인딩하기" FontFamily="나눔고딕코딩" FontSize="16"> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <ScrollBar Name="scrollBar" HorizontalAlignment="Center" Margin="10" Width="500" Height="20" Orientation="Horizontal" Maximum="100" SmallChange="1" LargeChange="10" /> <Label Name="label" HorizontalAlignment="Center" Margin="10"> </Label> </StackPanel> </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
|
using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Data; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); Binding binding = new Binding(); binding.Source = this.scrollBar; binding.Path = new PropertyPath(ScrollBar.ValueProperty); binding.Mode = BindingMode.OneWay; binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; binding.Converter = new DoubleToDecimalValueConverter(); binding.ConverterParameter = "2"; this.label.SetBinding(Label.ContentProperty, binding); } #endregion } } |
TestProject.zip
■ Binding 엘리먼트의 ElementName 속성을 사용해 특정 엘리먼트 속성을 바인딩하는 방법을 보여준다. ▶ DoubleToDecimalValueConveter.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
|
using System; using System.Globalization; using System.Windows.Data; namespace TestProject { /// <summary> /// 실수↔10진수 값 변환자 /// </summary> [ValueConversion(typeof(double), typeof(decimal))] public class DoubleToDecimalValueConverter : 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">CultureInfo</param> /// <returns>변환 값</returns> public object Convert(object sourceValue, Type targetType, object parameter, CultureInfo cultureInfo) { decimal targetValue = new decimal((double)sourceValue); if(parameter != null) { targetValue = decimal.Round(targetValue, int.Parse(parameter as string)); } return targetValue; } #endregion #region 역변환하기 - ConvertBack(sourceValue, targetType, parameter, cultureInfo) /// <summary> /// 역변환하기 /// </summary> /// <param name="sourceValue">소스 값</param> /// <param name="targetType">타겟 타입</param> /// <param name="parameter">파라미터</param> /// <param name="cultureInfo">CultureInfo</param> /// <returns>역변환 값</returns> public object ConvertBack(object sourceValue, Type targetType, object parameter, CultureInfo cultureInfo) { return decimal.ToDouble((decimal)sourceValue); } #endregion } } |
▶ 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 34 35 36 37 38 39 40 41
|
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TestProject" Width="800" Height="600" Title="Binding 엘리먼트 : ElementName 속성을 사용해 특정 엘리먼트 속성 바인딩하기" FontFamily="나눔고딕코딩" FontSize="16"> <Window.Resources> <local:DoubleToDecimalValueConverter x:Key="DoubleToDecimalValueConverterKey" /> </Window.Resources> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <ScrollBar Name="scrollBar" HorizontalAlignment="Center" Margin="10" Width="500" Height="20" Orientation="Horizontal" Maximum="100" SmallChange="1" LargeChange="10" /> <Label HorizontalAlignment="Center" Margin="10"> <Label.Content> <Binding ElementName="scrollBar" Path="Value" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource DoubleToDecimalValueConverterKey}" ConverterParameter="2" /> </Label.Content> </Label> </StackPanel> </Window> |
TestProject.zip
■ Binding 태그 확장의 ElementName 속성을 사용해 특정 엘리먼트 속성을 바인딩하는 방법을 보여준다. ▶ DoubleToDecimalValueConveter.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
|
using System; using System.Globalization; using System.Windows.Data; namespace TestProject { /// <summary> /// 실수↔10진수 값 변환자 /// </summary> [ValueConversion(typeof(double), typeof(decimal))] public class DoubleToDecimalValueConverter : 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">CultureInfo</param> /// <returns>변환 값</returns> public object Convert(object sourceValue, Type targetType, object parameter, CultureInfo cultureInfo) { decimal targetValue = new decimal((double)sourceValue); if(parameter != null) { targetValue = decimal.Round(targetValue, int.Parse(parameter as string)); } return targetValue; } #endregion #region 역변환하기 - ConvertBack(sourceValue, targetType, parameter, cultureInfo) /// <summary> /// 역변환하기 /// </summary> /// <param name="sourceValue">소스 값</param> /// <param name="targetType">타겟 타입</param> /// <param name="parameter">파라미터</param> /// <param name="cultureInfo">CultureInfo</param> /// <returns>역변환 값</returns> public object ConvertBack(object sourceValue, Type targetType, object parameter, CultureInfo cultureInfo) { return decimal.ToDouble((decimal)sourceValue); } #endregion } } |
▶ 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 34 35 36 37
|
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TestProject" Width="800" Height="600" Title="Binding 태그 확장 : ElementName 속성을 사용해 특정 엘리먼트 속성 바인딩하기" FontFamily="나눔고딕코딩" FontSize="16"> <Window.Resources> <local:DoubleToDecimalValueConverter x:Key="DoubleToDecimalValueConverterKey" /> </Window.Resources> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <ScrollBar Name="scrollBar" HorizontalAlignment="Center" Margin="10" Width="500" Height="20" Orientation="Horizontal" Maximum="100" SmallChange="1" LargeChange="10" /> <Label HorizontalAlignment="Center" Margin="10" Content="{Binding ElementName=scrollBar, Path=Value, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource DoubleToDecimalValueConverterKey}, ConverterParameter=2}" /> </StackPanel> </Window> |
TestProject.zip
■ 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> |
■ Hyperlink 엘리먼트의 TargetName/NavigateUri 속성을 사용해 페이지를 이동하는 방법을 보여준다. ▶ 예제 코드 (XAML)
|
<Hyperlink TargetName="frame" NavigateUri="Chapter02.xaml"> Chapter II </Hyperlink> |
※ frame는 Frame 타입이다.
■ x:TypeArguments 속성을 사용해 제너릭 타입 인자를 지정하는 방법을 보여준다. ▶ List (XAML)
|
(XAML)"><src:List x:TypeArguments="s:String" /> |
▶ Dictionary (XAML)
|
(XAML)"><src:Dictionary x:TypeArguments="s:String,s:String" /> |
▶ Queue (XAML)
|
(XAML)"><src:Queue x:TypeArguments="s:String,s:String" /> |
■ 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 |
■ Tablet 클래스의 TabletDevices 속성을 사용해 Tablet 장치 설치 여부를 조사하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Windows.Input; #region Tablet 장치 설치 여부 조사하기 - IsTableDeviceInstalled() /// <summary> /// Tablet 장치 설치 여부 조사하기 /// </summary> /// <returns>Tablet 장치 설치 여부</returns> public bool IsTableDeviceInstalled() { return Tablet.TabletDevices.Count > 0; } #endregion |
■ ResourceDictionary 엘리먼트를 사용해 리소스를 병합하는 방법을 보여준다. 동일한 키가 존재하는 경우, 메인 리소스 사전에 해당 리소스가 있으면 우선적으로 참조된다. 메인 리소스
더 읽기
■ StaticResource 태그 확장에서 x:Static 태그 확장을 사용해 시스템 리소스를 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
|
Foreground="{StaticResource {x:Static SystemColors.ActiveCaptionBrushKey}}" |
■ x:Key 속성에서 x:Static 태그 확장을 사용해 시스템 리소스를 재정의하는 방법을 보여준다. ▶ 예제 코드 (XAML)
|
<StackPanel> <StackPanel.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.ActiveCaptionBrushKey}" Color="Red" /> </StackPanel.Resources> <Button HorizontalAlignment="Center" VerticalAlignment="Center" Margin="24" Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionBrushKey}}"> Button with Red text </Button> </StackPanel> |
■ DynamicResource 태그 확장을 사용해 정적 속성 값을 참조하는 방법을 보여준다. ▶ 예제 코드 (XAML)
|
<Label Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionBrushKey}}"> Test </Label> |
■ DynamicResource 엘리먼트를 사용해 정적 속성 값을 참조하는 방법을 보여준다. ▶ 예제 코드 (XAML)
|
... <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> |