본문 바로가기

전체 글

11 WPF 리소스 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. 지금까지 애플리케이션 어셈블리에 임베딩되는 페이지드에 대해서 이야기했다. 그러나 컨텐트는 다양한곳으로부터 로딩될 수 있다. 소스 코드가 있는 어셈블리에 같이 포함(embedding)되어 있을 수도 있지만 참조되는 어셈블리에 있을 수도 있고, 또는 어셈블리에 포함되어 있지 않은 다른 자유로운 파일(loose file)들로 되어 있을 수도 있다. 그런 자유로운 파일들은 로컬 디스크, 파일 공유 서버, 또는 웹 사이트에 있을 수 있다. 그리고 컨텐트가 어셈블리에 포함되어 있든 자유로운 파일로 존재하든간에 그것이 꼭 페이지(Page)일 필요는 없다. 컨텐트는 이미지, 비디오, 오디오 같은 다양한 미디어를 가질 수 있다. 그리고 컨텐트는 반드시 .. 더보기
10 Frame 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. Frame은 다른 스타일의 네비게이터(독립형 또는 브라우저 기반, 메뉴 기반 또는 하이퍼링크 기반) 가 호스팅하는 컨텐트에 브라우저 스타일의 사용자 경험을 포함시킬 수 있다. 그것의 유연성을 고려해서 개발자는 Frame을 사용하는 방법을 결정할때는 의도된 사용자 경험에 맞도록 잘 결정해야 한다. 독립형, 메뉴 기반의 애플리케이션은 도움말 파일 같은 문서 스타일의 컨텐트로 네비게이팅하는 적절한 모델이 되지 못한다. 대신에 그림 10처럼 하이퍼링크 방식이 좀더 적절할 것이고 쉽게 독립형 애플리케이션의 윈도우(Window)에 임베딩될 수 있을 것이다. 그림 10 독립형 윈도우에서의 브라우징 가능한 컨텐트 이것은 다음과 같은 마크업으로 가능하다.. 더보기
09 XAML Browser Applications 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. NavigationWindow, Page, 그리고 Hyperlink는 독립형 애플리케이션에서 브라우저 스타일의 사용자 경험을 제공해 줄 수 있는 좋은 방법이다. 비록 즐겨찾기, 브라우징 탭과 같은 장식용 기능들을 가지고 있지는 않지만 NavigationWindow는 어떤 의미에서는 하나의 브라우저이다. 많은 사용자들이 브라우저에 익숙해져 있기 때문에 브라우저와 같은 기능들 또는 브라우저와 통합될 수 있는 애플리케이션에 좀 더 편안함을 느끼게 될 것이다. 만약 애플리케이션이 브라우저의 호스팅을 받고 하이퍼링크가 기반이 되는 환경을 제공받을 수 있다면 그곳이 바로 WPF XAML 애플리케이션(XBAP)이 가야 할 방향일 것이다. 예제 애플리.. 더보기
08 NavigationService 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. WPF에서 NavigationService를 이용하면 앞에서와 같은 페이지와 페이지 호스트간의 서로 독립적인 관계를 이룰 수 있다. NavigationService는 네비게이션, 네비게이션 히스토리, 네비게이션 생명주기(lifetime)등을 포함한 네비게이션 엔진의 기본적인 기능들을 구현하고 있다. 다음은 NavigationService타입의 주요 멤버들을 보여주고 있다. sealed class NavigationService : IContentContainer { // Navigation public bool Navigate(Uri source); // Navigate to URI public void Refresh(); // Re-n.. 더보기
07 NavigationWindow 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. 지금쯤이면 몇가지 의문 사항들이 있을 수 있을 것이다. Page가 윈도우는 아니라고 했다. 그렇다면 그것을 호스팅하는 윈도우는 어디서 왔는가? 하이퍼링크를 클릭하면 그 네비게이션을 실제로 처리하는 것은 무엇인가? 그리고 어떻게 해서 HTML 웹 페이지가 WPF 애플리케이션에서 출력될 수 있게 되는가? 이 모든 것을 담당하는 것은 NavigationWindow이다. Application.StartupUri 속성이 XAML 또는 HTML 페이로 설정되면 Application(이 페이지들은 자신들을 호스팅할 윈도우가 없다는 것을 알고 있다)은 그것들을 호스팅할 NavigationWindow 인스턴스를 생성한다. NavigationWindow는.. 더보기
06 Hyperlink 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. 문서의 모든 차례를 보려면 SmartClient3.0 카테고리를 참조하기 바란다. 하이퍼링크 기반의 애플리케이션은 하나 이상의 XAML 페이지를 갖게 될 것이고 사용자들에게 이런 페이지들간에 네비게이트할 수 있는 방법을 제공할 필요가 있을 것이다. 해서 WPF는 Hyperlink 클래스를 제공하고 있다. ... Ordering Guidelines ... Hyperlink는 HTML의 HREF와 동일한 프로그래밍 모델을 사용하여 다른 XAML 페이지로 네비게이트할 수 있다. 개발자는 이동할 대상 페이지의 URI(이 경우는 OrderingGuidelinesPage.xaml)와 그리고 사용자들이 보고 클릭할 수 있는 텍스트(이 경우는 "Ord.. 더보기
05 Page 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. Page는 웹을 대중화시키는데 일조를 한 HTML웹 페이지에 대응되는 WPF 버전이다. 이전에 언급한 것처럼 하이퍼링크 기반의 네비게이션은 독립형과 브라우저형 애플리케이션 모두에서 지원된다. WPF에서 하이퍼링크 네비게이션 경험의 기본이 되는 컨텐트가 바로 Page이다. Visual Studio 2005의 프로젝트에서 Project | Add New File | Page(WPF)를 선택하면 마크업과 코드 비하인드로 된 Page를 프로젝트에 추가할 수 있다. 이때 다음과 비슷한 코드가 생성된다. ... ... // HomePage.xaml.cs (codebehind) using System.Windows.Controls; // Page p.. 더보기
04 Window 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. 문서의 모든 차례를 보려면 SmartClient3.0 카테고리를 참조하기 바란다. WPF에서 윈도우는 Window로 구현된다. Window는 항상 독립형 애플리케이션에서는 컨텐트를 호스팅하는 기본적인 단위가 되어 왔다. Visual Studio 2005에서 Project | Add New Item | Window(WPF) 를 선택하면 Window가 하나 프로젝트에 추가된다. 더보기
03 애플리케이션 타입(Application Type) 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. 그림 1과 같은 간단한 예제 박스 애플리케이션을 생각해보자. 독립형의 메뉴 기반 애플리케이션으로서 사용자들은 필요한 박스들의 목록을 보고 주문하고 주문을 삭제할 수도 있다. 이런 사용자 경험을 제공하기 위해서, 애플리케이션 제작의 가장 기본적인 것부터 시작할 필요가 있다 : 애플리케이션 생성. 그림 1 박스 애플리케이션 윈도우 기반의 애플리케이션은 몇가지 표준적인 기반 구조를 가지고 있다 : 엔트리 포인트와 메시지 루프. 그리고 다음과 같은 공통적인 애플리케이션 서비스가 필요할 수도 있다. l 커맨드 라인 파라미터 처리 l 종료 코드(exit code) 반환 l 애플리케이션 영역의 상태 l 처리하지 않은 예외 처리 l 애플리케이션 생명주.. 더보기
02 사용자 경험(User Experience) 이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다. UX(사용자 경험)은 애플리케이션의 컨텐트와 그것을 호스팅하는 방법이다. WPF에서는 일반 컨트롤,2D, 3D 그래픽 그리고 애니메이션, 데이터바인딩, 레이아웃, 템플릿등을 사용해서 컨텐트를 출력한다. 그러나 사용자가 그 컨텐트를 보고 그것과 상호 작용을 할 수 있도록 호스팅이 되기 전까지는 거의 쓸모가 없다. 윈도우 애플리케이션에서는 바로 애플리케이션이 컨텐트를 패키징하고 윈도우를 통해서 그것을 출력한다. 이곳이 바로 ‘애플리케이션 모델’ 개념이 등장하게 되는 문맥이다. 즉 컨텐트 패키징과 출력 방법에 따라 애플리케이션 모델이 구분될 수 있다는 것이다. WPF 애플리케이션은 두 가지 타입으로 구분될 수 있다. : 독립형(standalo.. 더보기
01 WPF로 사용자 경험(User Experience) 높이기 Build A Great User Experience With Windows Presentation Foundation 이번 포스트는 MSDN 매거진 10월에 실린 아티클을 번역(번역은 달봉이한테 무리이고 그냥 나름대로 해석한 것이다.)한 내용을 올려 볼려고 한다. Smart Client 애플리케이션은 역시나 WPF(Windows Presentation Foundation)을 알아야 한다. SmartClient 기술이 나오고 웹 브라우저도에서도 Windows Form 기술의 컨트롤들을 호스팅하고 그리고 Windows Forms의 WebControl에서는 웹 페이지를 불러와 보여주고 하는 것이 지금의 상황이다. 즉 동일한 컨텐트인데 그것을 호스팅하는 컨테이너만 Windows Form으로 하느냐 아니면 웹 .. 더보기
ClickOnce에서 변경되지 않은 어셈블리의 다운 여부 테스트 Q&A 게시판에 올라온 질문중에서 “ClickOnce 배포에서 애플리케이션을 게시할때마다(기본적으로 게시 버전은 계속 높아진다), 어셈블리는 변경이 없더라도 다시 다운받는가” 라는 질문이 있었다. 이에 대해서 간단히 테스트를 해 봤다. 달봉이의 테스트 노트북 환경은 이렇다. ▶.NET 2.0 설치 ▶HTTP를 통한 어셈블리 다운 관찰 툴 : IE Inspector(http://www.ieinspector.com/index.html) 테스트를 해 본 결과 ClickOnce 애플리케이션의 버전은 올라가도 그 구성 어셈블리들은 버전이 동일하면 다운되지 않음을 알 수 있었다. ■ 테스트 #1 : 최초 다운 로드 모습 먼저 로컬 머신에 이미 다운된 ClickOnce 어셈블리들을 mage.exe –cc 명령을 통해.. 더보기
[연재 03] 원격 데이터 읽기 때로는 원격에 있는 데이터 파일을 읽어야 하는 경우가 있다. 예를 들어 동적으로 생성되는 데이터를 미리 웹 서버에 캐싱해두고 클라이언트 머신에서 읽어 오려는 경우가 있을 것이다. 달봉이가 지금 참여하고 있는 프로젝트에서는, 클라이언트에서 시스템이 구동될 때 항상 데이터베이스에서 메뉴를 조회해와서 출력해주는 구조로 되어 있다. 그러나 시스템의 운영시에는 메뉴의 수가 너무 과도해져서 시스템의 구동 시간이 길어질 것으로 예상되고 있다. 해서 메뉴가 변경될때마다 XML형태로 해서 웹 서버에 저장해놓고 클라이언트의 시스템이 구동될 때 그 파일을 바로 읽어 오는 방식을 고려하고 있다. 이 포스트에서는 이런 경우 사용할 수 있는 .NET의 API를 소개한다. HTTP를 통해서 원격의 파일 접근하기 다음은 웹 서버에 .. 더보기
[연재 02] 로컬 데이터 파일 읽기 앞의 포스트에서는 ClickOnce 배포로 로컬 PC에 데이터 파일을 저장하는 방법에 대해서 알아봤다. 이번에 그 저장된 파일을 읽는 방법에 대해서 알아본다. 2. 로컬 데이터 파일 읽기 ClickOnce 애플리케이션과 함께 배포되는 데이터 파일은 데이터 디렉토리(Data Directory)에 저장되는데, 그 디렉토리 경로는 애플리케이션 인스톨시 동적으로 결정된다고 했다. 따라서 직접적으로 그 물리적 경로를 기반으로 해서는 그 파일을 읽어들일 수 없다. 그래서 .NET 프레임워크에서는 데이터 파일이 저장되는 데이터 디렉토리에 접근(Read/Write)할 수 있는 API를 제공하고 있다. 데이터 디렉토리에서 읽고 쓰기 우선 데이터 디렉토리에서 파일을 읽고 쓰기 위해서는 ClickOnce 애플리케이션에는 디.. 더보기
[연재 01] 데이터 파일, ClickOnce 애플리케이션과 함께 배포하기 ClickOnce 애플리케이션을 작성하다 보면 텍스트 파일, XML 파일 또는 MS 액세스 DB 파일(.mdb)같은 데이터 파일을 각 클라이언트로 배포할 필요도 생기게 된다. 이번 포스트에서는 이런 데이터 파일을 ClickOnce에 포함시켜 클라이언트로 배포하는 방법을 알아본다. 그리고 클라이언트 애플리케이션에서 그 데이터 파일에 접근하는 방법을 알아본다. 1. 데이터 파일, ClickOnce 애플리케이션과 함께 배포하기 ClickOnce 애플리케이션이 클라이언트 PC에 인스톨되면 각 버전의 애플리케이션마다 자신만의 데이터 디렉토리(Data Directory)를 할당받게 된다. 데이터 디렉토리 경로가 미리 정해지지는 않는다. 애플리케이션마다 인스톨될 때 동적으로 정의된다. VS.NET의 배포 디자이너 폼.. 더보기
[연재 06] 서비스 컨트랙트 정의하기 혹시 여러분은 Windows Live Writer라는 프로그램을 아시나요? 브라우저를 통해서 블로그에 직접 로그인하지 않고도 이 프로그램에서 포스트를 작성해서 바로 블로그로 글을 올릴 수 있습니다. 호오 정말 편합니다. 한번 이 프로그램을 검색해서 알아보세요. 마이크로소프트에서는 이 프로그램에 대한 SDK를 배포하고 있습니다. 직접 애플리케이션에서 이런 기능을 구현할 수 있다는 것이죠. 호오...지금 이 포스트도 이 프로그램으로 작성해서 올리고 있습니다. 서비스 컨트랙트를 정의한다는 것은 외부로 노출되는 전체 서비스에 대한 왁구(토목 현장에서 많이 쓰는 말이다 -_-;)를 만드는 일이라고 볼 수 있다. 메타 정의(?)라고나 할까. 구현(implementation)과는 구분되는 단계이다. 서비스 컨트랙트는.. 더보기
[연재 05] WCF 관련 용어들 앞에서는 "Hello world WCF 버전"을 제작해 봄으로써 WCF 애플리케이션을 작성하는 단계를 하나씩 짚어봤다. 그 과정에서 나온 용어들을 몇개 정리해 보고자 한다. l 엔드 포인트(endpoint) 엔드 포인트들은 메세지를 주고 받는 종점으로서 메세지 교환에 필요한 정보를 정의한다. WCF 서비스는 하나 또는 이상의 애플리케이션 엔드 포인트를 노출시킨다. 클라이언트는 서비스가 노출시킨 엔드 포인트와 상호작용할 수 있는 엔드 포인트를 사용해야 한다. l 바인딩(binding) 바인딩(binding)은 "엔드 포인트(endpoint)에 연결하는데 필요한 것들을 지정하기 위해서 사용되는 객체들"이라고 정의할 수 있겠다. 바인딩은 엔드 포인트가 어떻게 바깥 세계와 통신을 하는지를 정의한다. 바인딩을 구.. 더보기
[연재 04] Hello world WCF 버전 3 4. WCF 클라이언트 프락시 클래스 및 config 파일 생성 WCF 서비스가 만들어졌으니 이제 Service Model Metadata Utility 툴(Svcutil.exe)을 이용하면 앞에서 말한 것처럼 클라이언트측 프록시 클래스와 설정 파일을 만들수 있다. /config 스위치를 사용하면 생성되는 설정 파일의 이름을 지정할 수 있다. 먼저 서비스 프로그램을 실행시킨다. 그런 다음, VS.NET을 설치하면 함께 설치되는 명령 프롬프트에서 다음 명령을 실행시킨다. svcutil /language:C# /config:app.config http://localhost/HelloService C 드라이브의 루트 폴더를 보면 프락시 클래스 파일과 환경 설정 파일이 생성되어 있을 것이다. 프락시 클래스파일은.. 더보기
[연재 03] Hello world WCF 버전 2 3. WCF 서비스 구동하기 그림처럼 config 파일을 추가한다. 추간된 config 파일에 다음 내용을 복사해 넣는다. Main() { // 서비스 타입에 맞는 ServiceHost인스턴스를 생성한고, 베이스 주소를 제공한다. using (ServiceHost serviceHost = new ServiceHost(typeof(HelloService))) { try { // ServiceHostBase를 오픈하면 리스너를 생성하고 메세지를 리스닝하기 시작한다. serviceHost.Open(); // The service can now be accessed. Console.WriteLine("서비스 작동중"); Console.WriteLine("서비스를 종료하려면 를 치세요."); Console.Wri.. 더보기
[연재 02] Hello world WCF 버전 1 걍, 바로 샘플 얘기로 들어가자. WCF(Windows Communication Foundation)가 뭔지, 장점이 뭔지 하는 얘기는 MSDN 등 기타 사이트에 “WCF”를 키워드로 해서 검색을 해 보면 수두룩하게 쏟아져 나온다. 간단히 얘기하자면, .NET3.0에서의 새로운 Communication 프로그래밍 모델로서, 웹 서비스나 .NET 리모팅을 대신할 수 있는 기술이다. 어떤 통신 프로그래밍에서든지 Communication 기능을 작성하기 위해서 하는 공통된 절차가 있다. 초 간단하게 절차를 얘기하자면 다음과 같을 것이다. “서버 프로그램을 작성하고, 서비스를 제공할 수 있는 환경을 구성하고 그런 다음 그것을 인식할 수 있는 클라이언트 프로그램을 작성한다”는 것이다. “Hello world” W.. 더보기