WPF 아키텍처

기본 WPF 프로그래밍 모델은 관리 코드를 통해 노출됩니다. WPF의 초기 디자인 단계에서는 시스템의 관리되는
구성 요소와 관리되지 않는 구성 요소를 정확하게 구분하는 방법에 대한 많은 논쟁이 있었습니다.
CLR에서는 보다 생산적이며 강력한 개발 작업을 수행하는 데 유용한 여러 기능(메모리 관리, 오류 처리, 공용
형식 시스템 등)을 제공하지만 이러한 이점에는 대가가 따릅니다.

WPF의 주요 구성 요소는 아래 그림에 설명되어 있습니다. 다이어그램의 빨간색 섹션(PresentationFramework,
PresentationCore 및 milcore)은 WPF의 주요 코드 부분입니다. 이 중에서 하나(milcore)만 관리되지 않는 구성
요소입니다. milcore는 DirectX와의 긴밀한 통합을 위해 비관리 코드로 작성되어 있습니다.
WPF에서의 모든 디스플레이는 DirectX 엔진을 통해 수행되므로 효율적인 하드웨어 및 소프트웨어 렌더링을
허용합니다. WPF에는 메모리 및 실행에 대한 세부적인 제어도 필요합니다. milcore에 있는 컴포지션 엔진은
성능의 영향을 크게 받으므로 성능을 높이기 위해 CLR의 여러 이점을 포기해야 했습니다.

WPF 아키텍처

대부분 Managed Code로 이루어져있지만 렌더링 엔진인 milcore는 Unmanaged Code로 이루어져있다.


출처 : http://msdn.microsoft.com/ko-kr/library/ms750441.aspx
2009/03/30 16:37 2009/03/30 16:37
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

코드로 WPF 컨텍스트 메뉴 오픈 방법 :: WPF ContextMenu Open in Code

윈도우즈 어플리케이션에서 마우스 오른쪽 클릭으로 팝업되는 메뉴를 'Context Menu'라고 부르는데
XAML에서는 System.Windows.Controls 네임스페이스아래 ContextMenu 클래스로 존재합니다.

WPF어플리케이션에서는 FrameworkElement라면 어떤 컨트롤이든지 ContextMenu를 설정할 수 있는데요.
예를들어 버튼에 컨텍스트 메뉴를 설정하고 싶다면 xaml에서는 아래와 같이
[code]
<Button x:Name="ui_button" Content="테스트 Button" >
 <Button.ContextMenu>
 <ContextMenu x:Name="contextMenu" >
  <MenuItem Header="menu 1." />
  <MenuItem Header="menu 2." />
 </ContextMenu>
 </Button.ContextMenu>
</Button>

[/code]
버튼컨트롤의 ContextMenu라는 의존속성에 ContextMenu를 할당해 두면 사용자 마우스 오른쪽버튼 이벤트에
반응하여 자동으로 컨텍스트 메뉴를 띄워주게됩니다.

그런데 가~끔 이 컨텍스트메뉴를 사용자 개입없이 자동으로 띄워야 할 필요가 있는데요..
코드에서 컨텍스트 메뉴를 띄우는건 contextMenu.IsOpen=true; 라는 짧은 코드로 가능합니다...만!!

이런걸 원한게 아닌데..

이런걸 원한게 아닌데... 끙..


예.. 컨텍스트메뉴가 버튼에서 팝업되는게아니라 마우스 포인터 옆에서 팝업되어버립니다.
컨텍스트메뉴, 드롭다운, 툴팁등은 팝업시스템으로 동작하는 또다른 윈도우이기 때문에 나타나는 현상입니다.
WPF의 팝업 시스템에대한 자세한 이야기는 아래 MSDN의 글을 참조하시도록 하구요..
http://msdn.microsoft.com/ko-kr/library/system.windows.controls.primitives.popup.aspx
그럼, 어떻게하면 우리가 바라는대로 버튼 옆에 컨텍스트 메뉴를 띄울 수 있냐...
ContextMenu의 PlacementRectangle, HorizontalOffset ,VerticalOffset 의존속성을 설정하면
가능해 집니다.

[code]
//컨텍스트 메뉴가 열릴 기준이되는 UI엘리먼트의 화면좌상단으로부터 위치(point)를 구합니다.
Point targetPoint = ui_button.PointToScreen( new Point(0,0) );

//컨텍스트 메뉴가 popup될 영역과 기준위치를 설정합니다
contextMenu.PlacementRectangle = new Rect(targetPoint, new Size( ui_button.Width, ui_button.Height));
contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.RelativePoint;
//offset을 주시구요…
contextMenu.HorizontalOffset = 10;
contextMenu.VerticalOffset = 10;

//컨텍스트 메뉴를 여시면 됩니다.
contextMenu.IsOpen = true;

[/code]

자.. 위와같이 수정 후 실행 하시면..

짜잔~

짜잔~


예 원하는 결과대로 되었습니다.
이 포스팅의 요지는 위에서 설명한 팁이 될수도 있겠지만 그보다는 'WPF의 팝업시스템의 이해' 정도가 되겠군요. ^^

2009/03/03 15:29 2009/03/03 15:29
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon
    백미란

    contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.RelativePoint;
    이렇게 하면 오른쪽버튼 클릭했다가 다시 왼쪽버튼을 눌렀을때 이상한 좌표에서 컨텍스트 메뉴가 뜨네요~
    Con.Placement = System.Windows.Controls.Primitives.PlacementMode.AbsolutePoint;
    이렇게 해야 정상으로 나와요 ^^ 강의 감사합니다~
    그런데 혹시 오른쪽 버튼 눌렀을때 컨텍스트 메뉴가 뜨지 않게 막는 방법도 있나요 ?
    그리고 바탕화면 쉘 컨텍스트 메뉴처럼 정보를 읽어와 뜨게 하는 방법이 있는지도 궁금합니다..

  2. 하하. 좋은 정보로 ^^) 프로젝트 이슈 하나 풀어갑니다.

  3. Blog Icon
    써니

    헐....
    잘 보고 갑니다.. 쩝... 처음으로 뜨네요 ... ㅋ

어렵네.. 어려워...


GUI 애플리케이션 개발.. 어렵네 어려워...
GUI 애플리케이션을 개발해 본 건 Swing 애플리케이션을, 그것도 NetBeans Platform 위에 구현해 본게
(Default Component로만..) 전부인 이력으로 WPF로 본격적인 GUI 애플리케이션을 개발하려니
여간 어려운 게 아니다. [아주 피똥을 싸고 있음.. >.< ]

누가 좀 Dependency Object랑 Dependency Property의 개념 좀 알려주셈..
OOP의 관점에서 접근하려니 이게 도대체 무슨 말을 하고 있는 건지... 쩝..

아래 링크를 통해 Dependency Property의 개념을 좀 장착할 수 있었음.
http://iamgsiwpf.tistory.com/21
http://www.hoons.kr/Board.aspx?Name=QAnet3&Mode=2&BoardIdx=9800


2008/11/07 18:53 2008/11/07 18:53
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WPF 문서 & 블로그 정리

Maximizing WPF 3D Performance on Tier-2 Hardware

WPF Amazon Explorer Using 3D

WPF를 사용하여 컨트롤 및 3D 표면에 비디오 추가

WPF 미디어 비주얼 관련 코드 조각 많은 블로그

윈도우 미디어 플레이어의 Visualization을 WPF로 제작하기

Using COM Interop to Create a WPF Visualization for Windows Media Player

Walkthrough: Hosting an ActiveX Control in Windows Presentation Foundation

각 종 대화상자 및 커스텀 대화상자 제작( 영문 , 한글 )

WPF상에서의 각종 드래그앤드롭

Win32 위에 WPF컨트롤 랜더링 하기

WPF Data Binding 개발담당 Beareiz Costa의 블로그 : 각 컨트롤에 데이타를 바인딩하는 상세기법 설명

C#으로 스크롤바 커스터마이징 하기

Vista Shell 스타일의 Drag & Drop  : Screencast보기

Rendering text in the adorner layer

WPF 어플리케이션 성능 최적화 MSDN 문서

Thread를 이용한 파일복사하기-프로그래스바

Printing a Form in a report fashion (release 2.2)

Mole II for WPF

WPF Podcaster - skinning 기법과 백그라운트 컬러 변경에 경악!!

WPF Ribbon Control Library - MS Office 2007에 적용된 리본 인터페이스에 대한 WPF 라이브러리

WPF Weather reader control - 날씨 컨트롤

2008/03/20 18:32 2008/03/20 18:32
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WPF에서 비디오 재생하는 두가지 방법 :: Media Player on WPF

WPF상에서 비디오를 재생하기 위해서 다음과 같은 2가지 객체를 이용 할 수 있습니다.

System.Window.Control.MediaElement System.Window.Media.MediaFlayer가 그것입니다.

동작 영상은 http://screencast.com/t/6IoXozpFL 을 참조.

( 프레임레이트가 낮은 것은 캡처링 때문이지 WPF성능상의 문제는 아닙니다. )


MediaPlayer를 사용할 때 주의해야 할 점은 이 클래스는 직접적인 시각 표현이 없으며 시각적 트리에
직접 추가할 수 없다는 점입니다.
비디오를 재생하려면 MediaPlayer를 가져온 다음 해당 표면을
VisualBrush
와 같은 시각적
트리에 추가해야 합니다.

기본적으로 MediaElement MediaPlayer 클래스의 상위 래퍼입니다.

소스 코드 보기..


본 코드를 작성 한 후 XP에서 테스트를 진행 했을 때 아래와 같은 현상을 발견 할 수 있었습니다.

OS

.Net Framework

Codec 설치여부

WMP 버전

Direct X

영상 표시 여부

Win XP sp2

3.0

X

9

9.0c

X

Win XP sp2

3.0

O

9

9.0c

X

Win XP sp2

3.0

X

11

9.0c

X

Win XP sp2

3.0

O

11

9.0c

O

Win XP sp2

3.5

O

10

9.0c

O


위 표로 미루어 보아 C#에서 제공하고 있는 MediaPlayer 클래스를 사용하기 위해서는 기본적으로

윈도우 미디어 플레이어 10이상과 플레이하고자 하는 동영상의 코덱이 필요합니다.

( 윈도우즈 Vista는 기본적으로 WMP 11 이 설치되어 있으므로 해당 코덱만 설치되어 있다면 영상이 표시됩니다.
MSDN 공식문서에도 WMP 10이상이 필요하다고 명시되어 있군요..)

2008/02/21 15:34 2008/02/21 15:34
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 初めてでも安心して使えるサイト<a href="http://mobaq.jp/">出会い系サイトmobaQ</a><a href="http://dkguide.com/">出会い系ガイドライン</a>

  2. Blog Icon
    지젝

    좋은 정보 잘 보고 갑니다. ^-^

WPF 폰트 버그 언제나 해결될까..

MS Expression Blend 툴에서는 잘 구분되는 폰트가 왜 빌드하고 실행하면 안 먹히는 거냐?
Windows XP도 닷넷 프레임웤이 돌아가는 MS OS 아니더냐... 뭐가 불만인게야...
폰트 안티앨리어싱 끄고 켜는 옵션이 없는 것도 답답해 죽겠는데..
동작하지도 않는 폰트 임베딩 기능을 뭐하러 넣어 놓은거야.. 앙?
아직 프리뷰니 정식 버전에 고쳐지길 기다리는 수밖에 없는 거니?

Blend 에서 폰트 적용

두 폰트 차이가 보이시죠?

실행시 폰트 적용 안됨

XP에서 실행하면 그냥 시스템 폰트가 적용되어 버립니다. T.T


폰트 안티앨리어싱을 제어할 수 없어 폰트로 어떻게 회피해 보려고 했는데.. Vista에서는 멀쩡히
동작하는 기능이 XP에서는 동작하고 있지 않습니다.( 현재까지는요.. 다음번 프리뷰에서는 이 부분도
수정되었으면 좋겠군요..)

2007/12/13 16:49 2007/12/13 16:49
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. XAML에서 폰트의 안티 앨리어싱은 벡터 렌더링 특성상 켜고 끄지는 못할 것 같아요. 혹시 WPF에서는 폰트를 기본적인 벡터렌더링을 사용하지 않고 비트맵 렌더링 하는 방법도 있을지는 모르겠지만요.

  2. XAML을 완전히 C#코드로 대치할 수 있는걸로 미루어보아 WPF의 C#코드로도 조절할 수 없을 것 같습니다.
    이런 문제 때문에 MS 비스타의 기본 폰트를 맑은고딕으로 잡은것 같기도해요.

MS Visual Studio 2005로 WPF 개발환경 구축하기

MS 비주얼 스튜디오 2008에는 기본적으로 WPF개발 환경이 포함되어 있지만 비주얼 스튜디오 2005환경에서
WPF 개발을 하기 위해선 몇 가지 프로그램을 추가 설치해야 합니다.

MS 비주얼 스튜디오 2005 개발환경에서 WPF(Windows Presentation Foundation) 개발 환경을 구축하기 위해
설치 해야 하는 프로그램의 일람을 정리해 둡니다.

우선 OS와 비주얼 스튜디오 2005까지 설치가 된 상태에서 시작하겠습니다.

1. Visual Studio 2005 SP1 설치 ( 다운로드 )
2. .Net Framework 3.5 설치(3.0 unInstall을 우선 수행 )  ( 다운로드 )
3. Windows SDK for Windows Vista 설치  ( 다운로드 )
4. Visual Studio 2005 Extensions for WPF and WCF 설치  ( 다운로드 )
5. Visual Studio 2005 Extensions for WWF 설치  ( 다운로드 )
6. (Option)Microsoft Expression Design 설치  ( 다운로드 )
7. (Option)Microsoft Expression Blend 설치  ( 다운로드 )
8. (Option)Microsoft Expression Web 설치  ( 다운로드 )
9. (Option)XmlNotepad 설치  ( 다운로드 )
10. (Option)WPF Performance Tool 설치  ( 다운로드 )

개발 환경을 구축하는데 위에 열거한 모든 프로그램을 추가 설치 해야 하는 것은 아닙니다.
4번 항목까지만 설치하면 기본적인 개발환경은 갖추어지며, 그 나머지는 필요에 따라 선택적으로
설치 하시면 됩니다.
2007/12/07 15:07 2007/12/07 15:07
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 2008/10/23 01:47
    Visual Studio 2005에서 WPF환경 구축 Tracked from 배고픈 공돌이네
  1. 너무너무 잘보고갑니다^^

WPF (Winsows Presentation Foundation) Application 개발 협업

wpf 어플리케이션 개발 협업도
전통적인 윈도우즈 어플리케이션 개발과 비교해 큰 차이점이라면 디자이너와 개발자 사이에
Integrator 역할이 추가되었다는 것.
관련 자료를 찾아보면 Integrator는 디자인 감각이 있는 senior 개발자가 맡는 것이 적당하다고 한다.

개발자와 디자이너가 서로의 영역을 더 잘 이해할 때 퀄리티 있는 어플리케이션 개발이 가능하다고 할까?
지난 몇 주간 디자이너들과 샘플 프로그램 작업을 하면서 절실히 느꼈던 부분이기도 하다.


2007/10/24 11:21 2007/10/24 11:21
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WPF 어플리케이션 트레이 아이콘으로 실행하기

2007/10/16 22:34

서비 .NET & WPF ,

아래는 WPF로 작성된 윈도우즈 어플리케이션을 트레이 아이콘으로 실행 할 수 있는 코드.

public partial class Window1 : System.Windows.Window
{

    public Window1()
    {
        InitializeComponent();

        System.Windows.Forms.NotifyIcon ni = new System.Windows.Forms.NotifyIcon();
        ni.Icon = new System.Drawing.Icon("Main.ico");
        ni.Visible = true;
        ni.DoubleClick += 
            delegate(object sender, EventArgs args)
            {
                this.Show();
                this.WindowState = WindowState.Normal;
            };
    }

    protected override void OnStateChanged(EventArgs e)
    {
        if (WindowState == WindowState.Minimized)
            this.Hide();

        base.OnStateChanged(e);
    }
}


트레이 아이콘에서 제거 하고 싶으면 NotifyIcon 클래스의 Visible 프로퍼티를 조작한다.
ni.Visible = false;





2007/10/16 22:34 2007/10/16 22:34
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WPF (Winsows Presentation Foundation) Class Hierarchy

2007/10/05 23:35

서비 .NET & WPF ,

WPF (Winsows Presentation Foundation) Class Hierarchy

WPF (Winsows Presentation Foundation) Class Hierarchy

Windows Presentation Foundation 의 Class 계층도
2007/10/05 23:35 2007/10/05 23:35
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WPF (Winsows Presentation Foundation) LifeTime :: WPF 어플리케이션 생명주기

WPF (Winsows Presentation Foundation) LifeCycle

출처 : MSDN Library


MSDN에 있는 WPF의 라이프 사이클에 대한 그림이다.
가운데 Application Object 상자 안이 코어 부분인데, 하나의 Application은
Run 매서드로 시작해서 Shutdown 매서드의 호출로 끝나게 된다.
Shoutdown 매서드의 호출은 ShutdownMode의 값에 따라서 Application이 자동으로 호출해주는 경우와  
사용자가 반드시 호출해주는 경우로 구분된다. 그리고 Activated, Deactivated,
DispatcherUnhandledException, SessionEnding, Exit는 Application에 발생하는 이벤트이다.
SessionEnding의 경우는 사용자가 OS를 Shutdown하거나 Logoff 시에 호출되는데 이 이벤트 안에서
OS의 종료를 취소시킬 수 있다. 또한 DispatcherUnhandledException 이벤트는 Application에서
처리되지 않는 예외가 발생했을 경우에 발생하는 범용 예외 처리가 가능한 곳으로 지정하지
않았을 경우 예외가 발생하면 Application은 자동으로 종료된다. 
2007/10/01 12:01 2007/10/01 12:01
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다