목차

사소but중요

특수기호 입력

< 90% 50% >
< &lt;
> &gt;
& &amp;
" &quot;
<!-- Display special characters that require special encoding: < > & " -->
<TextBlock>
  &lt;    <!-- Less than symbol -->
  &gt;    <!-- Greater than symbol -->
  &amp;   <!-- Ampersand symbol -->
  &quot;  <!-- Double quote symbol -->
</TextBlock>
 
<!-- Display miscellaneous special characters -->
<TextBlock>
  Cæsar   <!-- AE dipthong symbol -->
  © 2006  <!-- Copyright symbol -->
  Español <!-- Tilde symbol -->
  ¥       <!-- Yen symbol -->
</TextBlock>

데이터 바인딩

컨트롤을 사용하는 것은 그나마 쉬운데, 데이터 바인딩 쪽은 바인딩할 데이터 소스 설정바인딩 소스 연결 부분이 쉽지 않다.

바인딩

바인딩(걸수 있는)소스

Mode (연결 방식)

바인딩소스 업데이트

참고(읽을만한) URL

WPF 
  * url : http://msdn.microsoft.com/ko-kr/library/aa970268(v=vs.110).aspx
  * 이전에 ASP.NET, Windows Forms 등의 관리되는 기술을 사용하여 .NET Framework으로 응용 프로그램을 작성해 본 경험이 있는 개발자에게는 기본 WPF 프로그래밍 환경이 매우 친숙하답니다.

Binding

  바인딩(걸수 있는)소스
    CLR 개체
    XML 데이터 또는 파일
    ADO.Net 데이터
    UIElement(?)
    List와 같은 목록 개체

  Mode
    OneWay
    TwoWay
    OneWayToSource

정적 바인딩의 예

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:thisapp="clr-namespace:ThisApp"  
  Title="TestCode">
	
  <!-- Window 태그의 리소스 부분에 (??)를 연결 -->
  <Window.Resource>
    <!-- SomeList1, SomeList2 라는 클래스를 "SomeList1", "SomeList2"로 정의한다. -->
    <thisapp:SomeList1 x:Key="SomeList1"/>
    <thisapp:SomeList2 x:Key="SomeList2"/>
  </Window.Resource>
	
  <!-- 위에서 정의한 리소스를 DataContext에 선언해서 사용한다. -->
  <TextBlock Name="textBox2" DataContext="{StaticResource SomeList1}">
    <TextBlock.Text>
      <Binding Path="DefaultText"/>
    </TextBlock.Text>
  </TextBlock>
</Window>

- 윈도우가 아닌 탭 또는 그리드에도 ".Resource"가 붙는다면 정의 가능.

MSDN 레퍼런스

- [[http://msdn.microsoft.com/ko-kr/library/ms752039(v=vs.110).aspx|데이터바인딩방법]]
- [[http://msdn.microsoft.com/ko-kr/library/ms752347(v=vs.110).aspx#binding_to_collections|컬렉션에 바인딩]]
- [[http://msdn.microsoft.com/ko-kr/magazine/cc700358.aspx|데이터 바인딩과 WPF를 사용한 데이터 표시 사용자 지정]]

WPF Control

= StackPanel : StackPanel 태그 안쪽의 컨트롤을 차곡차곡 순서대로 배열해서 보여준다.
= Grid : StackPanel같은 자동 정렬 없이, 유저가 배치한 그대로 화면에 표시
= ListBox : 리스트박스 (위에서 아래로 쭉 가는)
= ListView : 리스트뷰. 윈도우즈의 그것.
= Expander : 이것 아래 항목을 폴딩하는 그것
= sys:DateTime : 날짜나 시간
= ComboBox : cb
= ComboBoxItem : cbi
= ListBox : 리스트박스
= ListBoxItem : 리스트박스아이템
= SelectedItems : 리스트박스 같은 거에서 여러개 선택
= ListView : 리스트뷰
= ListView.View : 리스트뷰의 뷰?
= TextBox : 한줄 이상의 내용을 입력
= InkCanvas : 마우스나 스타일러스로 수기 작성된 내용을 인식하기 위한 컨트롤

셀렉터(selector)컨트롤

공통 프로퍼티?

셀렉터 컨트롤의 개별 아이템의 첨부 프로퍼티

리스트박스

리스트뷰

서브프로퍼티

엘리먼트의 크기 및 위치 조정과 형태변형

형태 변형 적용

키워드

패널 이용한 화면 배치

컨텐츠 오버플로 처리

프로그램의 구조화와 배포

윈도우 엘리먼트 외관

CommandLine 얻기

Application class

중복 실행 방지

bool _mutex;
using( System.Threading.Mutex m = new System.Threading.Mutex(true, _NAME_, out _mutex) ) {
  if(_mutex) // 첫번째 인스턴스. 프로그램 실행.
  else // 이미 실행 중

System.Windows

대화상자 만들기 보여주기

공통 대화 상자

미지원 대화상자는 System.Windows.Forms.dll 을 사용한다.

직접 만드는 대화상자

설정 저장 불러오기

아래 클래스 써서 파일에 환경 값을 쓰거나 읽어온다.

'내문서'폴더에 숨김 속성으로 데이터를 파일로 저장한다.

탐색 기반 윈도우즈 응용 프로그램

실용적인 예제인가?

페이지와 탐색 컨테이너

NavigationService.Navigate(_OTHER_PAGE_);
// or
NavigationService.Navigate(new Uri("_OTHER_PAGE.xaml", UriKind.Relative));
// or
NavigationService.Navigate(new Uri("_REAL_WEB_URL_"));

하이퍼링크

<TextBlock>
  Click <Hyperlink NavigateUri="_OTHER_PAGE_.xaml">here</Hyperlink> 
</TextBlocK>

저널 기능

페이지 탐색의 히스토리. Back, Forward 지원해서 남아 있는 기록대로 페이지 전환한다.

탐색 이벤트

가젯 스타일 응용 프로그램

GadgetWindow.xaml
<Window x:Class="ConvToUTF8.GadgetWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ConvToUTF8"
        mc:Ignorable="d"
        Title="GadgetWindow" Height="300" Width="300"
        AllowsTransparency='True' WindowStyle='None' Background='Transparent'
        MouseLeftButtonDown='Window_MouseLeftButtonDown'>
<!-- AllowsTransparency, WindowStyle, Background 설정해서 가젯 스타일로 -->  
  <Grid>
    <Ellipse Fill='Red' Opacity='0.5' Margin='20'>
      <Ellipse.BitmapEffect>
        <DropShadowBitmapEffect/>
      </Ellipse.BitmapEffect>
    </Ellipse>
    <Button Margin='100' Click='Button_Click'>CLOSE</Button>
  </Grid>
</Window>
GadgetWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
 
namespace ConvToUTF8
{
    /// <summary>
    /// GadgetWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class GadgetWindow : Window
    {
        public GadgetWindow()
        {
            InitializeComponent();
        }
 
        void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            this.DragMove();
        }
 
        void Button_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}