<UniformGrid>

<Button Click="Button_Click">확인</Button>

<!--popupAnimation : 사라지는효과/ placement : 나타나는 위치/ AllowsTransparency : 배경투명-->

<Popup PopupAnimation="Fade" Placement="Mouse" Name="popup1" AllowsTransparency="True">

<!--테두리 감싸는 속성-->

<Border Padding="10" BorderThickness="1" CornerRadius="20" BorderBrush="Red" Background="White"> <TextBlock>테스트</TextBlock>

</Border>

</Popup>

 

<MediaElement Width="160" Height="120" Name="media1"></MediaElement><!--Media재생용-->

 

<StackPanel>

<Button Click="Button_Click_1">재생</Button>

<Button Click="Button_Click_2">멈춤</Button>

</StackPanel>

</UniformGrid>

 

 


 

이벤트 

private void Button_Click(object sender, RoutedEventArgs e)//button클릭

{

if (popup1.IsOpen)

popup1.IsOpen = false;

else

popup1.IsOpen = true;

}

 

private void Button_Click_1(object sender, RoutedEventArgs e)//미디어재생용 (시작)

{

media1.Source = new Uri(@"D:\[06]WPF\dh.wmv"); //소스 경로지정

media1.LoadedBehavior = MediaState.Manual;

media1.Play();

}

 

private void Button_Click_2(object sender, RoutedEventArgs e)//미디어재생용 (멈춤)

{

media1.Stop();

}

 


 

by 피요히코~ 2009. 2. 25. 12:53

 

<!--TreeView, Menu, Toolbar Tray-->

<DockPanel>

<Menu DockPanel.Dock="Top">

<!--Menu : DockPanel Dock속성을 위로-->

<MenuItem Header="파일(_F)">

<MenuItem Header="열기(_O)" Click="MenuItem_Click"        />

<!--Click Event-->

<MenuItem Header="닫기(_X)"/>

</MenuItem>

<MenuItem Header="편집(_E)">

<MenuItem Header="잘라내기(_C)"/>

<MenuItem Header="붙여넣기(_P)"/>

<MenuItem Header="삭제(_D)"/>

</MenuItem>

</Menu>

 

<TabControl DockPanel.Dock="Top">

<TabItem Header="페이지1">

<!--이게 TabPage-->

<StackPanel>

<!--TabItem 자식을 하나만 가질수 있으므로 다른 많은 자식을 가질수 있는 Content 사용(Ex StackPanel)-->

<Button>페이지1버튼</Button>

<TextBox/>

<RichTextBox></RichTextBox>

<PasswordBox></PasswordBox>

<InkCanvas Width="300" Height="200" Background="Yellow"/>

</StackPanel>

</TabItem>

 

<TabItem Header="페이지2">

<StackPanel>

<!--IsExpanded : 창이 열리자마자 열려있게 할지 여부-->

<Expander Header="항목1" IsExpanded="True">

<GroupBox Header="소항목1">

<TextBlock>테스트...</TextBlock>

</GroupBox>

</Expander>

<Expander Header="항목2">

<TextBlock>테스트2...</TextBlock>

</Expander>

<TreeView>

<TreeViewItem Header="데이터베이스">

<TreeViewItem Header="시스템 데이터베이스"/>

<TreeViewItem Header="Northwind"/>

</TreeViewItem>

<TreeViewItem Header="보안">

<TreeViewItem Header="로그인">

<TreeViewItem Header="Windows"/>

<TreeViewItem Header="Passport"/>

<TreeViewItem Header="Forms"/>

</TreeViewItem>

</TreeViewItem>

<TreeViewItem Header="자격증명"/>

<TreeViewItem Header="서버역할"/>

</TreeView>

</StackPanel>

</TabItem>

</TabControl>

 

<ToolBarTray DockPanel.Dock="Top">

<!--ToolBarTray-->

<ToolBar>

<Button>새프로젝트</Button>

<Button>열기</Button>

<Button>저장</Button>

</ToolBar>

<ToolBar>

<!--사용하기위해 이름지정-->

<TextBox Width="100" x:Name="txtSerch"/>

<Button Content="검색하기" Click="Button_Click"/>

<!--Click Event-->

</ToolBar>

</ToolBarTray>

</DockPanel>


 

 

by 피요히코~ 2009. 2. 25. 12:52

<XAML>

<Canvas><!--Canvas에서는 좌표가 같을경우 진짜로 두 Contents가 겹쳐있는거다. (다른경우는 앞에껄 빼고 들어간것)-->

<Button Canvas.Left="100" Canvas.Top="50">Btn1</Button> <!--맞춘 방향을 기준으로 Ancher-->

<Button Canvas.Left="200" Canvas.Top="100">Btn2</Button>

</Canvas>


 

 

<C#>

  - XAML

 

<Canvas Name="canvas"></Canvas>

 

 

   - C#

 

Button btn1 = new Button();

btn1.Content = "Btn1";

canvas.Children.Add(btn1);//<canvas>에 넣고

Canvas.SetLeft(btn1, 100);//위치지정

Canvas.SetTop(btn1, 50);

 

Button btn2 = new Button();

btn2.Content = "Btn2";

canvas.Children.Add(btn2);

Canvas.SetLeft(btn2, 200);

Canvas.SetTop(btn2, 100);



by 피요히코~ 2009. 2. 25. 12:51

<XAML>

<UniformGrid Columns="2" Rows="2"><!-- 디폴트 :Panel처럼 알아서 Contents를 넣어줌

(화면크기에 맞춰서 알아서) 행이나 열갯수를 정해주면 그거에 맞춤/ 행과열을 모두 정해주면

그에맞는 수만큼만 넣어주고 나머지는 가려짐-->

<Button>Btn1</Button>

<Button>Btn2</Button>

<Button>Btn3</Button>

<Button>Btn4</Button>

<Button>Btn5</Button>

<Button>Btn6</Button>

<Button>Btn7</Button>

</UniformGrid>


 

 

<C#>

   - XAML

<UniformGrid Columns="5" Rows="5" Name="grid">

</UniformGrid>

 

   - C#

for (int i = 0; i < 7; i++)

{

Button btn = new Button();

btn.Content = "Btn" + i.ToString();

grid.Children.Add(btn);

}


by 피요히코~ 2009. 2. 25. 12:50

<XAML> 

 

 <Grid ShowGridLines="True"> <!--ShowGridLines : 그리드 라인 보이기 옵션-->

<Grid.ColumnDefinitions> <!--3열 정의-->

<ColumnDefinition Width="50"></ColumnDefinition>

<ColumnDefinition Width="*"></ColumnDefinition>

<ColumnDefinition Width="50"></ColumnDefinition>

</Grid.ColumnDefinitions>

<Grid.RowDefinitions><!--2행 정의-->

<RowDefinition Height="50"></RowDefinition>

<RowDefinition></RowDefinition>

</Grid.RowDefinitions>

<!--<Button Grid.Column="0">Btn1</Button>--><!--들어갈 열값 명시 - 디폴드는 다 0행0열-->

<StackPanel Grid.Column="0">

<Button>Btn1</Button>

<Button>Btn4</Button>

</StackPanel>

<Button Grid.Column="1">Btn2</Button>

<Button Grid.Column="2">Btn3</Button>

<!--Grid는 들어갈 행과 열을 하나하나 지정해줘야함-->

<Button Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2">Btn5</Button> </Grid>

 


 

 

<C#>

//Grid

Grid grid = new Grid();

this.Content = grid;

grid.ShowGridLines = true; //gridline

RowDefinition row = new RowDefinition();//행

row.Height = new GridLength(100);//높이지정  //전체크기가 300x300

grid.RowDefinitions.Add(row);

row = new RowDefinition();

row.Height = GridLength.Auto;

grid.RowDefinitions.Add(row);

ColumnDefinition col = new ColumnDefinition();//열

col.Width = new GridLength(100);//너비지정

grid.ColumnDefinitions.Add(col);

col = new ColumnDefinition();

grid.ColumnDefinitions.Add(col);

//Label

Label label = new Label();

label.Content = "문자열 : ";

grid.Children.Add(label); //일단 label을 grid에 넣어준다. 그 후에 장소지정

Grid.SetRow(label, 0);//0행 <Label Grid.Row="0">

Grid.SetColumn(label, 1);//0열 <Label Grid.Colum="1">

//TestBox

TextBox txt = new TextBox();

txt.BorderBrush = Brushes.Red;

txt.BorderThickness = new Thickness(1);

grid.Children.Add(txt);

Grid.SetRow(txt, 1);

Grid.SetColumn(txt, 1);

//Button

Button btn = new Button();

btn.Content = "버튼";

grid.Children.Add(btn);

Grid.SetRow(btn, 0);

Grid.SetColumn(btn, 0);//일단 위치 지정후 병합

Grid.SetRowSpan(btn, 2); //병합할대상, 병합할 셀의 수  //<Button Grid.RowSpan="2">


by 피요히코~ 2009. 2. 25. 12:50

<WarpPanel>

<ScrollViewer>

<WrapPanel Orientation="Horizontal" ItemWidth="50" ItemHeight="50">

<!--자동개행이 되는 패널/ 디폴트로 Contents의 크기가 그 Contents의 Contents크기로 들어짐(Button내용에 맞게 크기가 정해짐)-->

<!--하지만 가로로만 자동으로 맞춰지고. 세로로는 맞춰지지 않음 >> ScrollViewer사용-->

<Button>Btn</Button>

<Button>Btn</Button>

<Button>Btn</Button>

<Button>Btn</Button>

</WrapPanel>

</ScrollViewer>

 

====================================================================================================== 

 

<DockPanel>

<DockPanel LastChildFill="False"><!--디폴트 : 마지막으로 들아가는 Contents가 Fill로 채워짐(LastChildFill = "False"하면 풀림)-->

<Button DockPanel.Dock="Top">Btn1</Button> <!--붙는 방향지정-->

<Button DockPanel.Dock="Left">Btn2</Button><!--자신이 마지막 Contents라면 방향을 지정해도 그냥 Fill-->

</DockPanel>


by 피요히코~ 2009. 2. 25. 12:49

image

.NET Framework 4.0 은 Visual Studio 2010 에 포함되는 최신 프레임워크입니다. 이전에는 .NET Framework 의 새로운 특징이라면 .NET Framework 의 기능 향상과 안정성, 그리고 기능 개선이었습니다. 하지만 .NET Framework 4.0 은 탄탄한 Based .NET Framework 를 통해 여러 가지 새로운 변화를 가져옵니다.

이제는 .NET Framework 가 Win32 API 와 같이(Win32 API 와 비교하기 적절하지는 않지만…) 라이브러리의 집합이 아닌, 어플케이션의 차원에서 보다 견고하고 세련된 빌딩(Building) 을 할 수 있는 진정한 프레임워크로 거듭납니다. .NET Framework 4.0 의 특징을 살펴 봅니다.

Base Class Library 개선

  • MEF(Managed Extensibility Framework)
    • 확장성이 쉬운 선언과 사용
    • 런타임 확장 모니터링
  • 데이터 구조 추가
    • BigInteger & CodeplexNumber
    • Tuple, SortedSet
  • IO 개선
    • 메모리 매핑 파일
    • 모델 해제 통일

MEF 는 어플케이션과 컴포넌트의 재사용성을 높이기 위한 새로운 라이브러리입니다. 확장성 있는 어플케이션과 프레임워크를 만들기 위해 MEF 가 그 대안이라고 제시하고 있습니다. 이 프로젝트는 현재 CodePlex 를 통해 Preview 4 가 릴리즈되었고, 여기에서 다운로드 받을 수 있습니다.

또한 64 비트 프로그래밍을 위한 새로운 데이터 구조가 추가 되었습니다. 64비트 컴퓨팅 시대에 맞춰 .NET Framework 의 Int32 가 한계였다면, 이제는 그보다 더 큰 비트 연산을 할 수 있는 데이터 구조와 새로운 데이터 구조가 추가 되었습니다.

Parallel Computing

  • Task Parallel Library (TPL)
    • 수평적인 병렬 작업의 실행
    • 최대 효율을 위한 Stealing 알고리즘 작업
    • 상위 레벨을 추상화 ( 더 이상 스레드의 지식이 필요 없다 )
  • Parallel Linq (PLINQ)
    • 선언적인 데이터 병렬처리(초점은 ‘무엇’, ‘어떻게’가 아니다)
    • LINQ to Object 를 사용하여 단순한 병렬 처리
  • Coordination Data Structures (CDS)
    • 병렬 처리를 쉽게 하기 위한 공통 구조

다중 코어 프로세서의 사용을 극대화 하기 위해 이제는 병렬 처리를 위해 스레드를 생성하여 동기화 하는 과정을 더 이상 고민하지 않아도 됩니다. 병렬 처리를 하기 위한 확장 메서드를 제공하며, LINQ 식을 통해 데이터의 병렬 처리가 무척이나 쉬워졌습니다. 이제는 ‘어떻게’가 아닌, '무엇을’ 병렬 처리 할 것인지만 생각하면 됩니다.

.NET Framework Client

  • Windows Presentation Foundation
    • 클라이언트 프로파일(Client Profile)
    • 비지니스 컨트롤에 초점
    • 실버라이트 시너지 효과
    • Windows 7 지원 (멀티터치 등)

ADO.NET 4.0

  • Entity Framework v2
    • Code-Fiirst 개발 지원
    • TDD 지원
    • 외래키(Foreign Key) 지원
    • Lazy 로딩

.NET Framework 3.5 SP1 에 등장한 Entity Framework 의 차기 버전입니다. 이전 버전은 기본 키를 중심으로 한 Entity Data Model 이였다면 새로운 버전에서는 외래 키도 지원하게 되었습니다. 또한, TDD(Test-Driven-Development) 을 지원하며, Code-First 방식의 개발도 지원하게 되었습니다.

ASP.NET 4.0

  • ASP.NET Dynamic Data 개선
  • ASP.NET MVC
  • MVC 에 ASP.NET Dynamic Data 지원
    • 데이터 중심으로 뷰와 커스텀 컨트롤 만들기 쉽게
  • CSS, ID, ViewState 컨트롤이 더 좋아진 ASP.NET
  • 확장할 수 있는 캐싱 프레임워크(Caching Framework)

ASP.NET 4.0 의 가장 큰 매력은 바로 ASP.NET MVC 의 통합입니다. 그 동안 Postback, ViewState 기반의 빠른 생산성이 ASP.NET 의 핵심이었습니다. 하지만, ASP.NET MVC 를 통해 Form 기반에서도 빠른 생산성을 향상시켰습니다. 또한, MVC 를 구현하기 위해 많은 코드와 분리 작업을 자동화 할 수 있는 템플릿을 지원합니다.

Velocity

  • .NET 을 위한 분산 캐싱
  • ASP.NET 의 Session State Provider
  • 유연하고, 서로 다른 캐싱 모델
    • Partitioned
    • Replicated
    • Local

.NET 이 지원하는 가장 대표적인 분산 캐싱이 ASP.NET 의 Session State Provider 입니다. 그렇지만 Session State Provider 의 분산 캐싱 능력에는 한계가 있으며, 이러한 한계를 극복할 수 있는 프레임워크가 바로 Velocity 입니다. 캐싱을 분산 처리 하기 위해 많은 고민을 해야 하며, 이러한 분산 캐싱 환경에서 빠른 응답성, 확장성, 고사용성을 높였습니다.

엔터프라이즈 어플케이션 환경에서 많은 관심을 보일 것이며, 특히 요즘 새롭게 대두 되고 있는 SaaS 나 Cloud Computing 을 위해 빠져서는 안될 핵심 기술이 될 것입니다.

Windows Workflow & Communication Foundation

  • 완전 선언적인 서비스
  • 워크플로우 개선
    • 프로그래밍 모델 개선
    • 새로운 플로우차트 모델 스타일 & 확장 활동 팔레트
    • 워크플로우 규칙 통합
    • 디자이너 경험 향상
    • 상당한 성능 향상
    • 상호 메시지
  • WCF 개선
    • Duplex 내구성
    • In-process Channel
    • WS-Discovery & UDP Channel

ADO.NET Data Services

  • 관계형 데이터 지원
  • ‘오프라인’ 상태 지원

ADO.NET Data Services 도 .NET Framework 3.5 SP1 에서 사용하기 위해 몇 가지 추가 작업이 필요하였으며, 보다 자세한 내용은 여기를 참고 하십시오.

특히, 이 버전에서는 Data Services 의 오프라인을 지원합니다. 오프라인에서도 ADO.NET Services 의 사용은 수 많은 외부 시스템과 연동 시에 서비스의 일관성을 유지해 줄 것입니다.

ASP.NET AJAX

  • 자바스크립트 UI 템플릿과 데이터 바인딩
  • AJAX 컨트롤 툴킷 개선
  • DOM Selection, 애니메이션 등

ASP.NET AJAX 는 요즘 가장 인기 있는 AJAX 프레임워크인 JQuery 와 통합하게 됩니다. JQuery 를 사용하고 인텔리센스를 지원하기 위해 몇 가지 수작업이 있었다면, 이제는 그러한 작업 없이도 JQuery 의 고급 기능을 ASP.NET AJAX 에서 사용할 수 있습니다.

출처 : 땡초님 블로그


아직  3.0도 제대로 못하는데. 이제 4.0이 곧 나오겠네요.
4.0 나오기 전에 3.0은 좀 어느정도 할줄 알게 됐음 좋겠는데..
열심히 해야겠네요
by 피요히코~ 2009. 2. 25. 10:27

"빌드"는 이전 빌드 이후 변경된 소스파일만 컴파일하고 링크하는 반면,
"다시 빌드"는 모든 소스파일을 컴파일하고 링크하는 것.
버전 싱크가 깨진 경우 "다시 빌드"를 통해 오류를 해결할 수 있다.



처음알았다..
-_ㅋ

출처:MangoLog
by 피요히코~ 2009. 2. 24. 10:17

디자인 원칙

 - 어플리케이션에서 달라지는 부분을 찾아내고, 달라내지 않는 부분으로부터 분리시킨다.
 - 바뀌는 부분은 따로 캡슐화.
 
 - 구현이 아닌 인터페이스에 맞춰서 프로그래밍
 - 객체가 코드에 의해 고정되지 않도록 상위형식(supertype)에 맞춰서 프로그래밍
   => 다형성 활용
 -  상위형식에 맞춰 프로그래밍 => 변수를 선언할때는 보통 추상 클래스나 인터페이스같은
    상위 형식으로 선언
    => 객체를 변수에 대입할때 상위 형식을 구체적으로 구현한 형식이라면 어떤 객체든 
        넣을수 있기 때문에
                  
 
 
by 피요히코~ 2009. 2. 23. 00:22
출처 : MSDN
http://msdn.microsoft.com/ko-kr/library/ms752914.aspx


Windows Presentation Foundation
종속성 속성 개요

업데이트: 2007년 11월

WPF(Windows Presentation Foundation)는 CLR(공용 언어 런타임) 속성의 기능을 확장하는 데 사용할 수 있는 서비스 집합을 제공합니다. 이러한 서비스를 통칭하여 WPF 속성 시스템이라고 합니다. WPF 속성 시스템의 지원을 받는 속성은 종속성 속성이라고 합니다. 이 개요에서는 WPF 속성 시스템 및 종속성 속성의 기능에 대해 설명합니다. 또한 XAML(Extensible Application Markup Language) 및 코드에서 기존 종속성 속성을 사용하는 방법도 설명합니다. 이 개요 부분에서는 종속성 메타데이터와 같은 종속성 속성의 특징 및 사용자 지정 클래스에 사용자 고유의 종속성 속성을 만드는 방법도 소개합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

이 항목에서는 독자가 CLR 및 개체 지향 프로그래밍에 대한 기본적인 지식을 갖고 있다고 가정합니다. 이 항목의 예제를 실행하려면 XAML을 이해하고 WPF 응용 프로그램 작성 방법을 알고 있어야 합니다. 자세한 내용은 Windows Presentation Foundation 시작을 참조하십시오.

WPF에서는 속성이 일반적으로 CLR(공용 언어 런타임) 속성으로 노출됩니다. 가장 기본적인 수준에서는 이러한 속성과 직접 상호 작용하면서도 속성이 종속성 속성으로 구현된 사실을 모를 수 있습니다. 그러나 WPF 속성 시스템의 기능을 활용하려면 이러한 기능 전체 또는 일부에 익숙해져야 합니다.

종속성 속성은 다른 입력 값을 기준으로 속성 값을 계산하기 위한 용도로 사용됩니다. 여기서 다른 입력 값에는 테마 및 사용자 기본 설정 같은 시스템 속성, 데이터 바인딩 및 애니메이션/Storyboard 같은 Just-In-Time 속성 결정 메커니즘, 리소스 및 스타일 같은 다용도 템플릿, 요소 트리에서 다른 요소와의 부모-자식 관계를 통해 알 수 있는 값 등이 포함될 수 있습니다. 또한 종속성 속성을 구현하여 독립적인 유효성 검사, 기본값, 다른 속성에 대한 변경 내용을 모니터링하는 콜백 및 런타임 정보를 기준으로 속성 값을 강제 변환할 수 있는 시스템을 제공할 수도 있습니다. 파생된 클래스에서도 구현되어 있는 기존 속성을 재정의하거나 새 속성을 만드는 대신 종속성 속성 메타데이터를 재정의하여 기존 속성의 일부 특징을 변경할 수 있습니다.

SDK 참조서에서 속성의 관리되는 참조 페이지에 종속성 속성 정보 섹션이 있는지 여부를 검사하여 해당 속성의 종속성 속성 여부를 확인할 수 있습니다. 종속성 속성 정보 섹션에는 해당 종속성 속성의 DependencyProperty 식별자 필드에 대한 링크 및 해당 속성에 대해 설정된 메타데이터 옵션 목록, 클래스별 재정의 정보 및 기타 세부 정보가 들어 있습니다.

종속성 속성과 WPF 속성 시스템은 전용 필드를 사용하여 속성을 지원하는 표준 방식 대신 속성을 지원하는 형식을 제공하여 속성의 기능을 확장합니다. 이 형식의 이름은 DependencyProperty입니다. WPF 속성 시스템을 정의하는 또 하나의 중요한 형식은 DependencyObject입니다. DependencyObject는 종속성 속성을 등록하고 소유할 수 있는 기본 클래스를 정의합니다.

다음은 이 SDK(소프트웨어 개발 키트) 설명서에서 종속성 속성을 설명하는 데 사용되는 용어 정의입니다.

  • 종속성 속성:DependencyProperty로 지원되는 속성입니다.

  • 종속성 속성 식별자:종속성 속성을 등록할 때 반환 값으로 반환된 후 클래스의 멤버로 저장되는 DependencyProperty 인스턴스입니다. 이 식별자는 WPF 속성 시스템과 상호 작용하는 대부분의 API에 매개 변수로 사용됩니다.

  • CLR "래퍼": 속성에 대한 실제 get/set 구현입니다. 이러한 구현은 종속성 속성 식별자를 GetValueSetValue 호출에 사용하여 통합함으로써 WPF 속성 시스템을 통한 속성 지원 기능을 제공합니다.

다음 예제에서는 IsSpinning 종속성 속성을 정의하고 DependencyProperty 식별자 및 이 식별자가 지원하는 속성 사이의 관계를 보여 줍니다.

public static readonly DependencyProperty IsSpinningProperty = 
    DependencyProperty.Register(


...


    );
public bool IsSpinning
{
    get { return (bool)GetValue(IsSpinningProperty); }
    set { SetValue(IsSpinningProperty, value); }
}

속성과 지원 DependencyProperty 필드의 명명 규칙은 매우 중요합니다. 필드 이름은 항상 속성 이름에 Property 접미사를 추가한 형식입니다. 이 규칙과 규칙을 사용하는 이유에 대한 자세한 내용은 사용자 지정 종속성 속성을 참조하십시오.

속성은 코드 또는 XAML에서 설정할 수 있습니다.

XAML에서 속성 값 설정

다음 XAML 예제에서는 단추의 배경색을 빨강으로 지정합니다. 이 예제는 생성된 코드에서 XAML 로더가 XAML 특성의 간단한 문자열 값 형식을 WPF 형식으로 변환하는 것을 보여 줍니다. 여기서는 SolidColorBrush를 사용하여 문자열 값 형식을 Color라는 WPF 형식으로 변환합니다.

<Button Background="Red" Content="Button!"/>

XAML에서는 다양한 형식의 구문을 사용하여 속성을 설정할 수 있습니다. 특정 속성에 사용할 구문은 해당 속성이 사용하는 값 형식뿐만 아니라 형식 변환기가 있는지 여부와 같은 다른 요인에 따라 달라집니다. 속성 설정에 사용하는 XAML 구문에 대한 자세한 내용은 XAML 개요XAML 구문 용어를 참조하십시오.

다음 XAML 예제에서는 특성을 사용하지 않는 구문의 예로 다른 단추 배경을 보여 줍니다. 이 경우에는 간단한 단색을 설정하는 대신 이미지를 나타내는 요소를 사용하고 해당 이미지의 소스를 중첩된 요소의 특성으로 지정하여 이미지를 배경으로 설정합니다. 이 예제는 속성 요소 구문의 예제입니다.

<Button Content="Button!">
  <Button.Background>
    <ImageBrush ImageSource="wavy.jpg"/>
  </Button.Background>
</Button>

코드에서 속성 설정

코드에서 종속성 속성 값을 설정하는 것은 일반적으로 CLR "래퍼"를 통해 노출되는 set 구현을 호출하는 것입니다.

Button myButton = new Button();
myButton.Width = 200.0;

속성 값을 가져오는 것도 사실상 get "래퍼" 구현을 호출하는 것입니다.

double whatWidth;
whatWidth = myButton.Width;

속성 시스템 API의 GetValueSetValue를 직접 호출할 수도 있습니다. 기존 속성을 사용하는 경우에는 래퍼가 더 편리하고 속성을 개발자 도구에 노출하는 데 더 유용하기 때문에 대개 이 방법을 사용하지 않아도 되지만 API를 직접 호출하는 것이 더 적절한 시나리오도 있습니다.

속성을 XAML에서 설정한 후 나중에 코드 숨김을 통해 코드에서 액세스할 수도 있습니다. 자세한 내용은 코드 숨김 및 XAML을 참조하십시오.

필드에서 지원되는 속성과 달리 종속성 속성은 속성의 기능을 확장하는 기능을 제공합니다. 일반적으로 이러한 기능 각각은 WPF의 전체 기능 집합 중에서 다음과 같은 특정 기능을 나타내거나 지원합니다.

리소스

종속성 속성 값은 리소스 참조를 통해 설정될 수 있습니다. 일반적으로 리소스는 페이지 루트 요소 또는 응용 프로그램의 자식 요소로 지정되며 이 두 위치는 리소스에 가장 편리하게 액세스할 수 있는 위치입니다. 다음 예제에서는 SolidColorBrush 리소스를 정의하는 방법을 보여 줍니다.

<DockPanel.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</DockPanel.Resources>

리소스를 정의한 후에는 다음과 같이 해당 리소스를 참조하고, 리소스를 사용하여 속성 값을 제공할 수 있습니다.

<Button Background="{DynamicResource MyBrush}" Content="I am gold" />

이 리소스는 DynamicResource 태그 확장으로 참조됩니다. XAML에서는 정적 또는 동적 리소스 참조를 사용할 수 있습니다. 동적 리소스 참조를 사용하려면 종속성 속성에 참조를 설정해야 하므로 이러한 동적 리소스 참조는 WPF 속성 시스템에서 활성화됩니다. 자세한 내용은 리소스 개요를 참조하십시오.

참고:

리소스는 로컬 값으로 처리되므로 다른 로컬 값을 설정하면 리소스 참조가 제거됩니다. 자세한 내용은 종속성 속성 값 우선 순위를 참조하십시오.

데이터 바인딩

종속성 속성은 데이터 바인딩을 통해 값을 참조할 수 있습니다. 데이터 바인딩은 XAML의 특정 태그 확장 구문 또는 코드의 Binding 개체를 통해 작동합니다. 데이터 바인딩을 사용할 경우 속성의 최종 값은 데이터 소스로부터 값을 가져오는 런타임에 결정됩니다.

다음 예제에서는 XAML에서 바인딩을 사용하여 ButtonContent 속성을 설정합니다. 이 경우 바인딩에는 상속된 데이터 컨텍스트와 XmlDataProvider 데이터 소스(이 예제에서는 보여 주지 않음)가 사용됩니다. 바인딩 자체는 데이터 소스 내의 XPath를 통해 원하는 소스 속성을 지정합니다.

<Button Content="{Binding XPath=Team/@TeamName}"/>

참고:

바인딩은 로컬 값으로 처리되므로 다른 로컬 값을 설정하면 바인딩이 제거됩니다. 자세한 내용은 종속성 속성 값 우선 순위를 참조하십시오.

종속성 속성(또는 DependencyObject 클래스)은 데이터 바인딩 작업 시 DependencyObject 소스 속성 값의 변경에 대한 알림을 생성하는 목적으로 사용되는 INotifyPropertyChanged를 기본적으로 지원하지 않습니다. 데이터 바인딩 시 데이터 바인딩 대상에 변경 내용을 보고하는 데 사용할 수 있는 속성을 만드는 방법에 대한 자세한 내용은 데이터 바인딩 개요를 참조하십시오.

스타일

스타일과 템플릿은 종속성 속성을 사용하는 두 가지 주요 시나리오입니다. 특히 스타일은 응용 프로그램 UI(사용자 인터페이스)를 정의하는 속성을 설정할 때 유용합니다. 일반적으로 스타일은 XAML에서 리소스로 정의됩니다. 스타일은 주로 특정 속성의 "setter"뿐만 아니라 다른 속성의 실시간 값을 기준으로 속성 값을 변경하는 "트리거"를 포함하기 때문에 속성 시스템과 상호 작용합니다.

다음 예제에서는 아주 간단한 스타일(여기에 나와 있지는 않지만 Resources 사전에 정의되어 있을 수 있음)을 만든 후 이 스타일을 ButtonStyle 속성에 직접 적용합니다. 스타일에 포함된 setter는 스타일이 지정된 ButtonBackground 속성을 녹색으로 설정합니다.

<Style x:Key="GreenButtonStyle">
  <Setter Property="Control.Background" Value="Green"/>
</Style>

<Button Style="{StaticResource GreenButtonStyle}">I am green!</Button>

자세한 내용은 스타일 지정 및 템플릿을 참조하십시오.

애니메이션

종속성 속성에는 애니메이션 효과를 줄 수 있습니다. 애니메이션 효과를 적용하고 실행할 경우, 애니메이션 효과 값은 속성의 다른 모든 값(예: 로컬 값)보다 우선 순위가 높습니다.

다음 예제에서는 Button 속성의 Background에 애니메이션 효과를 줍니다. 기술적으로 설명하면 속성 요소 구문을 사용하여 빈 SolidColorBrushBackground로 지정한 다음 이 SolidColorBrushColor 속성에 직접 애니메이션 효과를 주는 방법으로 Background에 애니메이션 효과를 적용합니다.

<Button>I am animated
  <Button.Background>
    <SolidColorBrush x:Name="AnimBrush"/>
  </Button.Background>
  <Button.Triggers>
    <EventTrigger RoutedEvent="Button.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <ColorAnimation
            Storyboard.TargetName="AnimBrush" 
            Storyboard.TargetProperty="(SolidColorBrush.Color)"
            From="Red" To="Green" Duration="0:0:5" 
            AutoReverse="True" RepeatBehavior="Forever" />
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Button.Triggers>
</Button>

속성에 애니메이션 효과를 주는 방법에 대한 자세한 내용은 애니메이션 개요Storyboard 개요를 참조하십시오.

메타데이터 재정의

종속성 속성을 등록하는 원래 클래스에서 속성을 파생시킬 때 해당 속성의 메타데이터를 재정의하여 종속성 속성의 특정 동작을 변경할 수 있습니다. 메타데이터를 재정의하려면 DependencyProperty 식별자가 필요합니다. 메타데이터를 재정의하기 위해 속성을 다시 구현할 필요는 없습니다. 메타데이터 변경 내용은 기본적으로 속성 시스템에서 처리합니다. 즉, 각 클래스는 기본 클래스에서 상속된 모든 속성에 대한 개별 메타데이터를 형식별로 보유합니다.

다음 예제에서는 DefaultStyleKey 종속성 속성의 메타데이터를 재정의합니다. 이 종속성 속성 메타데이터를 재정의하는 것은 테마의 기본 스타일을 사용할 수 있는 컨트롤을 만드는 구현 패턴의 일부입니다.

public class SpinnerControl : ItemsControl
{
    static SpinnerControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(SpinnerControl), 
            new FrameworkPropertyMetadata(typeof(SpinnerControl))
        );
    }
}

속성 메타데이터를 겹쳐쓰거나 얻는 방법에 대한 자세한 내용은 종속성 속성 메타데이터를 참조하십시오.

속성 값 상속

요소는 트리의 부모로부터 종속성 속성의 값을 상속할 수 있습니다.

참고:

상속 계산 시간은 성능에 영향을 줄 수 있기 때문에 속성 값 상속 동작은 모든 종속성 속성에 대해 전체적으로 사용할 수 없습니다. 일반적으로 속성 값 상속은 속성 값을 상속해야 하는 특정 시나리오에서만 허용됩니다. 종속성 속성이 상속되는지 여부는 SDK 참조서에서 해당 종속성 속성의 종속성 속성 정보 섹션을 통해 확인할 수 있습니다.

다음 예제에서는 바인딩을 보여 주고 앞에서 설명한 바인딩 예제에서는 보여 주지 않았던 바인딩 소스를 지정하는 DataContext 속성을 설정합니다. DataContext 속성 값은 상속되므로 이후에 자식 요소에서 지정하는 바인딩에는 부모 StackPanel 요소의 DataContext로 지정된 소스를 다시 설정하지 않아도 됩니다.

<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource XmlTeamsSource}}">
  <Button Content="{Binding XPath=Team/@TeamName}"/>
</StackPanel>

자세한 내용은 속성 값 상속을 참조하십시오.

WPF Designer 통합

종속성 속성으로 구현된 속성을 가진 사용자 지정 컨트롤에는 적절한 Windows Presentation Foundation(WPF) Designer for Visual Studio 기능을 사용할 수 있습니다. 한 가지 예를 들자면 연결된 종속성 속성 및 일반 종속성 속성을 속성 창에서 편집할 수 있습니다. 자세한 내용은 컨트롤 제작 개요를 참조하십시오.

종속성 속성의 값을 가져오는 것은 WPF 속성 시스템에 참여하는 다른 속성 기반 입력 중 하나를 통해 해당 속성에 설정된 값을 가져오는 것입니다. 종속성 속성 값의 우선 순위는 속성 값을 가져오는 다양한 시나리오 사이의 상호 작용을 예측하는 데 필요합니다.

다음 예제를 살펴보십시오. 이 예제에서는 모든 단추와 해당 Background 속성에 하나의 스타일을 적용한 후 Background 값이 로컬로 설정된 단추도 하나 지정합니다.

참고:

SDK 설명서에서는 종속성 속성을 설명할 때 "로컬 값" 또는 "로컬로 설정된 값"이라는 용어가 사용되는데 로컬로 설정된 값은 코드에서 개체 인스턴스에 직접 설정하거나 XAML에서 요소의 특성으로 설정한 속성 값을 의미합니다.

이 예제에서 첫 번째 단추에 대해서는 속성이 두 번 설정되었지만 우선 순위가 높은 값 하나만 적용됩니다. 로컬로 설정된 값이 우선 순위가 가장 높기 때문에 첫 번째 단추의 배경에는 스타일 setter 값 대신 로컬로 설정된 값이 사용됩니다. 이 예제에는 애니메이션이 없어서 상관없지만 애니메이션을 실행할 경우에는 애니메이션의 우선 순위가 가장 높습니다. 두 번째 단추에는 로컬 값(또는 스타일 setter보다 우선 순위가 높은 값)이 없기 때문에 스타일 setter에서 단추의 배경을 가져옵니다.

<StackPanel>
  <StackPanel.Resources>
    <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
     <Setter Property="Background" Value="Red"/>
    </Style>
  </StackPanel.Resources>
  <Button Background="Green">I am NOT red!</Button>
  <Button>I am styled red</Button>
</StackPanel>

종속성 속성의 우선 순위가 존재하는 이유

일반적으로 스타일이 항상 적용되어 개별 요소에 대해 로컬로 설정된 값도 덮어쓰도록 하면 스타일이나 요소를 일반적으로 사용하는 데 많은 문제가 생길 수 있습니다. 이러한 이유 때문에 스타일에서 가져온 값은 로컬로 설정된 값보다 우선 순위가 낮습니다. 종속성 속성 및 종속성 속성의 유효 값에 대한 자세한 목록을 보려면 종속성 속성 값 우선 순위를 참조하십시오.

참고:

WPF 요소에는 종속성 속성이 아닌 다른 여러 속성도 정의되어 있습니다. 전반적으로 속성은 데이터 바인딩, 스타일 지정, 애니메이션, 기본값 지원, 상속, 연결된 속성, 무효화 등과 같이 속성 시스템에서 지원하는 시나리오 중 적어도 하나를 지원해야 하는 경우에만 종속성 속성으로 구현됩니다.

  • 연결된 속성은 XAML에서 특수화된 구문을 지원하는 속성의 형식입니다. 연결된 속성은 대개 CLR(공용 언어 런타임) 속성과 일대일로 대응되지 않으며 종속성 속성이 아닐 수도 있습니다. 일반적으로 연결된 속성의 용도는 특정 속성이 부모 요소와 자식 요소의 클래스 멤버 목록에 공통적으로 들어 있지 않더라도 자식 요소에서 해당 속성 값을 부모 요소에 보고할 수 있도록 하는 것입니다. 연결된 속성을 사용하는 한 가지 주요 시나리오는 자식 요소가 UI에 표시되는 방법을 부모에 알릴 수 있도록 하는 경우입니다. 예제를 보려면 Dock 또는 Left를 참조하십시오. 자세한 내용은 연결된 속성 개요를 참조하십시오.

  • 구성 요소 개발자나 응용 프로그램 개발자는 고유한 종속성 속성을 만들어 데이터 바인딩이나 스타일 지원 또는 무효화와 값 강제 변환과 같은 기능을 사용할 수 있습니다. 자세한 내용은 사용자 지정 종속성 속성을 참조하십시오.

  • 일반적으로 종속성 속성은 인스턴스에 액세스할 수 있는 모든 호출자가 액세스하거나 최소한 검색할 수 있는 공용 속성으로 간주해야 합니다. 자세한 내용은 종속성 속성 보안을 참조하십시오.

by 피요히코~ 2009. 1. 8. 16:48