[C#/WPF] ResourceDictionary 엘리먼트 사용하기
■ ResourceDictionary 엘리먼트를 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 |
<ResourceDictionary Source="SampleResourceDictionary.xaml" /> |
■ ResourceDictionary 엘리먼트를 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 |
<ResourceDictionary Source="SampleResourceDictionary.xaml" /> |
■ Application 클래스의 Shutdown 메소드를 사용해 애플리케이션을 중지하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 |
using System.Windows; Application application = Application.Current; application.Shutdown(); |
■ Window 클래스를 사용해 투명 윈도우를 만드는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowStyle="None" AllowsTransparency="True" Background="Transparent" SizeToContent="WidthAndHeight"> <Button Width="100" Height="30"> 닫기 </Button> </Window> |
■ SaveFileDialog 클래스를 사용해 이미지 파일 저장 대화 상자를 표시하는 방법을 보여준다. ▶ SaveFileDialog 클래스 : 이미지 파일 저장 대화 상자 표시하기
■ SaveFileDialog 클래스를 사용해 파일 저장 대화 상자를 표시하는 방법을 보여준다. ▶ SaveFileDialog 클래스 : 파일 저장 대화 상자 표시하기 예제 (C#)
■ OpenFileDialog 클래스를 사용해 이미지 파일 열기 대화 상자를 표시하는 방법을 보여준다. ▶ OpenFileDialog 클래스 : 이미지 파일 열기 대화 상자 표시하기
■ OpenFileDialog 클래스를 사용해 파일 열기 대화 상자를 표시하는 방법을 보여준다. ▶ OpenFileDialog 클래스 : 파일 열기 대화 상자 보여주기 예제 (C#)
■ PageFunction<T> 클래스를 사용하는 방법을 보여준다. ▶ TestPageFunction.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<PageFunction x:Class="DS.Test.WPF.TestPageFunction" 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" x:TypeArguments="s:String" Title="TestPageFunction"> ... </PageFunction> |
▶ TestPageFunction.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 |
/// <summary> /// 테스트 페이지 함수 /// </summary> public partial class TestPageFunction : PageFunction<string> { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 값 /// </summary> private string value; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - TestPageFunction() /// <summary> /// 생성자 /// </summary> public TestPageFunction() { InitializeComponent(); } #endregion #region 생성자 - TestPageFunction(value) /// <summary> /// 생성자 /// </summary> /// <param name="value">값</param> public TestPageFunction(string value) : this() { this.value = value; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region OK 버튼 클릭시 처리하기 - okButton_Click(sender, e) /// <summary> /// OK 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void okButton_Click(object sender, RoutedEventArgs e) { OnReturn(new ReturnEventArgs<string>(this.value)); } #endregion #region Cancel 버튼 클릭시 처리하기 - cancelButton_Click(sender, e) /// <summary> /// Cancel 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void cancelButton_Click(object sender, RoutedEventArgs e) { OnReturn(new ReturnEventArgs<string>(null)); } #endregion } |
▶ CallTestPageFuncation.xaml
1 2 3 4 5 6 7 8 9 10 11 |
... <Hyperlink Name="hyperlink" Click="hyperlink_Click"> 테스트 페이지 함수 호출 </Hyperlink> ... |
▶ CallTestPageFuncation.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 |
... #region 테스트 페이지 함수 리턴시 처리하기 - testPageFunction_Return(sender, e) /// <summary> /// 테스트 페이지 함수 리턴시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void testPageFunction_Return(object sender, ReturnEventArgs<String> e) { if(e.Result != null) { Console.WriteLine(e.Result); } } #endregion #region 하이퍼링크 클릭시 처리하기 - hyperlink_Click(sender, e) /// <summary> /// 하이퍼링크 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void hyperlink_Click(object sender, RoutedEventArgs e) { TestPageFunction testPageFunction = new TestPageFunction("TestString"); testPageFunction.Return += new ReturnEventHandler<string>(testPageFunction_Return); NavigationService.Navigate(testPageFunction); } #endregion |
■ NavigationService 클래스의 GoForward/GoBack 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (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 |
using System.Windows; #region 전방향 탐색 버튼 클릭시 처리하기 - navigateForwardButton_Click(sender, e) /// <summary> /// 전방향 탐색 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void navigateForwardButton_Click(object sender, RoutedEventArgs e) { if(NavigationService.CanGoForward) { NavigationService.GoForward(); } else { MessageBox.Show("전방향 이력이 없습니다."); } } #endregion #region 역방향 탐색 버튼 클릭시 처리하기 - navigateBackButton_Click(sender, e) /// <summary> /// 역방향 탐색 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void navigateBackButton_Click(object sender, RoutedEventArgs e) { if(NavigationService.CanGoBack) { NavigationService.GoBack(); } else { MessageBox.Show("역방향 이력이 없습니다."); } } #endregion |
※ 상기 코드는 Page 파생 클래스에서 사용된 것을 가정한다.
■ NavigationService 클래스를 사용해 커스텀 객체를 탐색하는 방법을 보여준다. 1. Person 클래스를 정의한다. ▶ Person.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 |
using System.Windows.Media; /// <summary> /// 사람 /// </summary> public class Person { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 명칭 /// </summary> private string name; /// <summary> /// 선호 색상 /// </summary> private Color favoriteColor; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 명칭 - Name /// <summary> /// 명칭 /// </summary> public string Name { get { return this.name; } set { this.name = value; } } #endregion #region 선호 색상 - FavoriteColor /// <summary> /// 선호 색상 /// </summary> public Color FavoriteColor { get { return this.favoriteColor; } set { this.favoriteColor = value; } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - Person() /// <summary> /// 생성자 /// </summary> public Person() { } #endregion #region 생성자 - Person(name, favoriteColor) /// <summary> /// 생성자 /// </summary> /// <param name="name">명칭</param> /// <param name="favoriteColor">선호 색상</param> public Person(string name, Color favoriteColor) { this.name = name; this.favoriteColor = favoriteColor; } #endregion } |
2. Application 엘리먼트에서 Person 클래스를 위한
■ Frame 엘리먼트의 JournalOwnership 속성을 사용해 자체 저널을 만드는 방법을 보여준다. 기본적으로 Frame은 다른 저널이 없는 경우에만 자체 저널을 사용한다. Frame이 NavigationWindow
■ Frame 엘리먼트의 Source 속성을 사용해 페이지를 탐색하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 |
<Frame Source="Page1.xaml" /> |
■ NavigationWindow 엘리먼트의 Source 속성을 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 |
<NavigationWindow xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Source="HomePage.xaml" /> |
■ NavigationWindow 엘리먼트의 ShowsNavigationUI 속성을 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 |
<NavigationWindow xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ShowsNavigationUI="False" Source="HomePage.xaml"/> |
■ Hyperlink 엘리먼트에서 NavigationCommands 탐색 명령을 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> ... <Hyperlink Command="NavigationCommands.BrowseBack"> Back </Hyperlink> ... <Hyperlink Command="NavigationCommands.BrowseForward"> Forward </Hyperlink> ... </Page> |
■ Page 클래스에서 현재 페이지를 갱신하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 |
<Page x:Class="TestProject.Page1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> ... <Hyperlink Click="hyperlink_Click">Refresh this page</Hyperlink> ... </Page> |
▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 |
public partial class Page1 : Page { ... private void hyperlink_Click(object sender, RoutedEventArgs e) { NavigationService.Refresh(); } ... } |
※ NavigationService 속성에 저장된
■ Page 클래스에서 NavigationService 객체를 구하는 방법을 보여준다. ▶ NavigationService.GetNavigationService 정적 메소드 이용시 (C#)
1 2 3 4 5 |
using System.Windows.Navigation; NavigationService navigationService = NavigationService.GetNavigationService(this); |
▶ Page.NavigationService 속성 이용시 (C#)
1 2 3 4 5 6 7 8 9 10 |
using System.Windows.Controls; using System.Windows.Navigation; Page page; ... NavigationService navigationService = page.NavigationService; |
※
■ Hyperlink 엘리먼트에서 조각 탐색(Fragment Navigation)을 사용하는 방법을 보여준다. ▶ Page1.xaml
1 2 3 4 5 6 7 8 9 |
... <TextBlock Name="textBlock1"> Ea vel dignissim te aliquam facilisis ... </TextBlock> ... |
▶ Page2.xaml
1 2 3 4 5 6 7 8 9 |
... <Hyperlink NavigateUri="Page1.xaml#textBlock1"> Chapter II </Hyperlink> ... |
■ Page 클래스에서 호스트 윈도우의 제목, 넓이 및 높이를 설정하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 |
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowTitle="Page Title" WindowWidth="500" WindowHeight="200"> Hello, from the XBAP HomePage! </Page> |
■ ValidationRule 클래스을 사용하는 방법을 보여준다. ▶ MarginValidationRule.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 |
using System.Globalization; using System.Windows.Controls; namespace TestProject { /// <summary> /// 마진 검증 규칙 /// </summary> public class MarginValidationRule : ValidationRule { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 최소 마진 /// </summary> private double minimumMargin; /// <summary> /// 최대 마진 /// </summary> private double maximumMargin; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 최소 마진 - MinimumMargin /// <summary> /// 최소 마진 /// </summary> public double MinimumMargin { get { return this.minimumMargin; } set { this.minimumMargin = value; } } #endregion #region 최대 마진 - MaximumMargin /// <summary> /// 최대 마진 /// </summary> public double MaximumMargin { get { return this.maximumMargin; } set { this.maximumMargin = value; } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 검증하기 - Validate(value, cultureInfo) /// <summary> /// 검증하기 /// </summary> /// <param name="value">값</param> /// <param name="cultureInfo">문화 정보</param> /// <returns>검증 결과</returns> public override ValidationResult Validate(object value, CultureInfo cultureInfo) { double margin; if(!double.TryParse((string)value, out margin)) { return new ValidationResult(false, "숫자가 아닙니다."); } if((margin < this.minimumMargin) || (margin > this.maximumMargin)) { string message = string.Format ( "마진은 {0}과 {1} 사이의 값이어야 합니다.", this.minimumMargin, this.maximumMargin) ; return new ValidationResult(false, message); } return new ValidationResult(true, null); } #endregion } } |
▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
... <TextBox> <TextBox.Text> <Binding Path="Left" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <local:MarginValidationRule MinimumMargin="0" MaximumMargin="10" /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> ... |
■ LogicalTreeHelper 클래스에서 부적절한 IInputElement 객체를 찾는 방법을 보여준다. ▶ 예제 코드 (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 |
using System.Windows; #region 부적절한 IInputElement 객체 찾기 - FindInvalidInputElement(parentDependencyObject) /// <summary> /// 부적절한 IInputElement 객체 찾기 /// </summary> /// <param name="parentDependencyObject">부모 DependencyObject 객체</param> /// <returns>부적절한 입력 엘리먼트 객체</returns> /// <remarks>ValidationRule 객체를 설정한 IInputElement 객체 중에서 에러를 갖는 객체를 찾는다.</remarks> private IInputElement FindInvalidInputElement(DependencyObject parentDependencyObject) { if(parentDependencyObject == null) { return null; } if(parentDependencyObject is IInputElement) { if(Validation.GetHasError(parentDependencyObject)) { return parentDependencyObject as IInputElement; } } foreach(object childObject in LogicalTreeHelper.GetChildren(parentDependencyObject)) { if(childObject is DependencyObject) { IInputElement invalidInputElement = FindInvalidInputElement(childObject as DependencyObject); if(invalidInputElement != null) { return invalidInputElement; } } } return null; } #endregion |
■ TextBox 엘리먼트에서 스타일을 사용해 검증 에러 발생시 에러 내용을 Tooltip 속성에 설정하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<Style TargetType="{x:Type TextBox}"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="true"> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> </Trigger> </Style.Triggers> </Style> |
■ Button 엘리먼트의 IsCancel 속성을 사용해 디폴트 취소 버튼을 설정하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 |
<Button Name="cancelButton" IsCancel="True"> Cancel </Button> |
■ Button 엘리먼트의 IsDefault 속성을 사용해 디폴트 확인 버튼을 설정하는 방법을 보여준다. ▶ 예제 코드 (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 |
<Button Name="okButton" IsDefault="True" Click="okButton_Click"> OK </Button> ... #region OK 버튼 클릭시 처리하기 - okButton_Click(sender, e) /// <summary> /// OK 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void okButton_Click(object pSender, RoutedEventArgs e) { if(!IsValid(this)) // IsValid 함수는 사용자 정의 함수로 별도로 명시하지 않았다. { return; } DialogResult = true; } #endregion |
※ Cancel 버튼은 IsCancel 속성을