■ DependencyProperty 클래스의 Register 정적 메소드를 사용해 의존 속성을 만드는 방법을 보여준다.
▶ SpaceButton.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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
using System.Text; using System.Windows; using System.Windows.Controls; namespace TestProject { /// <summary> /// 공백 버튼 /// </summary> public class SpaceButton : Button { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 공백 속성 /// </summary> public static readonly DependencyProperty SpaceProperty; #endregion ////////////////////////////////////////////////////////////////////////////////////////// Instance //////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 텍스트 /// </summary> private string text; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 텍스트 - Text /// <summary> /// 텍스트 /// </summary> public string Text { set { this.text = value; Content = SpaceOutText(this.text); } get { return this.text; } } #endregion #region 공백 - Space /// <summary> /// 공백 /// </summary> public int Space { set { SetValue(SpaceProperty, value); } get { return (int)GetValue(SpaceProperty); } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Static #region 생성자 - SpaceButton() /// <summary> /// 생성자 /// </summary> static SpaceButton() { FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(); metadata.DefaultValue = 0; metadata.AffectsMeasure = true; metadata.Inherits = true; metadata.PropertyChangedCallback += SpacePropertyChangedCallback; SpaceProperty = DependencyProperty.Register ( "Space", typeof(int), typeof(SpaceButton), metadata, SpacePropertyValidateValueCallback ); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private ////////////////////////////////////////////////////////////////////// Event #region 공백 속성 변경시 콜백 처리하기 - SpacePropertyChangedCallback(d, e) /// <summary> /// 공백 속성 변경시 콜백 처리하기 /// </summary> /// <param name="d">의존 객체</param> /// <param name="e">이벤트 인자</param> private static void SpacePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { SpaceButton spaceButton = d as SpaceButton; spaceButton.Content = spaceButton.SpaceOutText(spaceButton.Text); } #endregion #region 공백 속성 값 검증시 콜백 처리하기 - SpacePropertyValidateValueCallback(sourceValue) /// <summary> /// 메공백 속성 값 검증시 콜백 처리하기 /// </summary> /// <param name="sourceValue">소스 값</param> /// <returns>처리 결과</returns> private static bool SpacePropertyValidateValueCallback(object sourceValue) { int value = (int)sourceValue; return value >= 0; } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Instance //////////////////////////////////////////////////////////////////////////////// Private ////////////////////////////////////////////////////////////////////// Function #region 텍스트 공백 출력하기 - SpaceOutText(source) /// <summary> /// 텍스트 공백 출력하기 /// </summary> /// <param name="source">소스 문자열</param> /// <returns>처리 결과</returns> private string SpaceOutText(string source) { if(source == null) { return null; } StringBuilder stringBuilder = new StringBuilder(); foreach(char character in source) { stringBuilder.Append(character + new string(' ', Space)); } return stringBuilder.ToString(); } #endregion } } |
▶ SpaceWindow.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 59 60 61 62 63 64 65 66 67 68 |
using System.Windows; namespace TestProject { /// <summary> /// 공백 윈도우 /// </summary> public class SpaceWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 공백 속성 /// </summary> public static readonly DependencyProperty SpaceProperty; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 공백 - Space /// <summary> /// 공백 /// </summary> public int Space { set { SetValue(SpaceProperty, value); } get { return (int)GetValue(SpaceProperty); } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Static #region 생성자 - SpaceWindow() /// <summary> /// 생성자 /// </summary> static SpaceWindow() { FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(); metadata.Inherits = true; SpaceProperty = SpaceButton.SpaceProperty.AddOwner(typeof(SpaceWindow)); SpaceProperty.OverrideMetadata(typeof(SpaceWindow), metadata); } #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 |
<local:SpaceWindow 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" SizeToContent="WidthAndHeight" Title="DependencyProperty 클래스 : Register 정적 메소드를 사용해 의존 속성 만들기" FontFamily="나눔고딕코딩" FontSize="16"> <Grid Name="grid"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> </Grid> </local:SpaceWindow> |
▶ 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 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 81 82 83 84 85 86 87 88 89 90 91 92 93 |
using System.Windows; using System.Windows.Controls; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : SpaceWindow { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); for(int i = 0; i < 3; i++) { SpaceButton button = new SpaceButton(); button.HorizontalAlignment = HorizontalAlignment.Center; button.VerticalAlignment = VerticalAlignment.Center; button.Tag = i; button.Text = "윈도우 공백 속성 설정 : " + i; button.Click += windowSpacePropertyButton_Click; this.grid.Children.Add(button); Grid.SetRow (button, 0); Grid.SetColumn(button, i); button = new SpaceButton(); button.HorizontalAlignment = HorizontalAlignment.Center; button.VerticalAlignment = VerticalAlignment.Center; button.Tag = i; button.Text = "버튼 공백 속성 설정 : " + i; button.Click += buttonSpacePropertyButton_Click; this.grid.Children.Add(button); Grid.SetRow (button, 1); Grid.SetColumn(button, i); } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 윈도우 공백 속성 버튼 클릭시 처리하기 - windowSpacePropertyButton_Click(sender, e) /// <summary> /// 윈도우 공백 속성 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void windowSpacePropertyButton_Click(object sender, RoutedEventArgs e) { SpaceButton button = e.Source as SpaceButton; Space = (int)button.Tag; } #endregion #region 버튼 공백 속성 버튼 클릭시 처리하기 - buttonSpacePropertyButton_Click(sender, e) /// <summary> /// 버튼 공백 속성 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void buttonSpacePropertyButton_Click(object sender, RoutedEventArgs e) { SpaceButton button = e.Source as SpaceButton; button.Space = (int)button.Tag; } #endregion } } |