728x90
반응형
LIST

[WPF] Panel에서 여러 타입의 UIElement 객체 컬렉션이 있는 경우 특정 UIElement만 선택해서 처리하는 방법

WPF의 Panel 클래스는 UIElement 객체의 컬렉션을 포함합니다.
Panel.Children 속성을 사용하면 해당 패널에 포함된 UIElement 컬렉션을 가져올 수 있습니다.
이 컬렉션은 UIElement 클래스의 자식 클래스인 FrameworkElementFrameworkContentElement를 모두 포함합니다.

따라서 Panel.Children 컬렉션을 사용하여 TextBox 요소만 선택적으로 처리하고 싶다면 LINQ 쿼리를 사용하여 쉽게 구현할 수 있습니다.
다음은 Panel.Children 컬렉션에서 TextBox 요소만 선택하는 방법입니다.

foreach (TextBox tb in Panel.Children.OfType())
{
   if (tb.Name.Equals("tbTextBox"))
   {
       tb.IsEnabled = false;
       break;
   }
}

 

728x90
반응형
LIST
728x90
반응형
LIST

소개

WPF(Microsoft Windows Presentation Foundation)는 .NET Framework에서 GUI(Graphical User Interface)를 개발하기 위한 프레임워크입니다. WPF는 다양한 UI 컨트롤과 기능을 제공하며, 이러한 기능을 활용하여 사용자 경험(UX)을 개선할 수 있습니다. MVVM(Model-View-ViewModel) 디자인 패턴은 WPF에서 가장 많이 사용되는 디자인 패턴 중 하나입니다. MVVM은 개발자가 애플리케이션의 유지보수와 확장성을 개선하는 데 도움을 주는 디자인 패턴입니다.

MVVM 디자인 패턴

MVVM 디자인 패턴은 애플리케이션을 세 가지 부분으로 나눕니다. Model, View, ViewModel입니다. Model은 데이터와 비즈니스 로직을 포함하고 있습니다. View는 UI(User Interface)를 담당하고, ViewModel은 View와 Model 사이에서 중개자 역할을 합니다. ViewModel은 View에서 필요한 데이터를 Model에서 가져와서 View에 전달합니다. 또한, ViewModel은 View에서 발생하는 이벤트를 처리하고, Model에 변경 사항을 알리는 역할도 합니다.

MVVM 디자인 패턴은 Model과 View 간의 의존성을 분리하여, 애플리케이션을 개발하고 유지보수하기가 쉬워집니다. 이는 코드의 복잡성을 줄이고, 개발 속도를 높이는 데 도움을 줍니다. 또한, ViewModel은 View와 Model 사이에서 중개자 역할을 하기 때문에, View와 Model 간의 의존성을 줄일 수 있습니다. 이는 코드의 재사용성과 유연성을 높이는 데 도움을 줍니다.

WPF MVVM의 장점

WPF MVVM 디자인 패턴은 애플리케이션의 유지보수와 확장성을 개선하는데 많은 도움을 줍니다. 이 디자인 패턴은 UI와 비즈니스 로직을 분리하기 때문에, 애플리케이션을 개발하고 유지보수하기가 쉬워집니다. 코드의 복잡성을 줄일 수 있고, 개발 속도를 높일 수 있습니다. 또한, ViewModel은 View와 Model 사이에서 중개자 역할을 하기 때문에, View와 Model 간의 의존성을 줄일 수 있습니다. 이는 코드의 재사용성과 유연성을 높이는 데 도움을 줍니다.

WPF MVVM 디자인 패턴은 애플리케이션의 유지보수와 확장성을 개선하는 데 도움을 주는 디자인 패턴입니다. 이 디자인 패턴을 사용하면, UI와 비즈니스 로직을 분리하고, ViewModel을 통해 View와 Model 사이의 의존성을 줄일 수 있습니다. 이는 코드의 재사용성과 유연성을 높이는 데 도움을 줍니다. 또한, WPF는 다양한 UI 컨트롤과 기능을 제공하기 때문에, 이러한 기능을 활용하여 사용자 경험(UX)을 개선할 수 있습니다.

WPF MVVM의 단점

WPF MVVM 디자인 패턴의 가장 큰 단점은 학습 곡선입니다. MVVM 디자인 패턴을 처음 사용하는 개발자는 이해하기 어려울 수 있습니다. 또한, WPF에서 MVVM 패턴을 사용하면 코드의 양이 많아지고, 개발 시간이 늘어날 수 있습니다.

결론

WPF MVVM 디자인 패턴은 애플리케이션의 유지보수와 확장성을 개선하는데 많은 도움을 주는 디자인 패턴입니다. 이 디자인 패턴은 UI와 비즈니스 로직을 분리하고, ViewModel을 통해 View와 Model 사이의 의존성을 줄이기 때문에, 코드의 재사용성과 유연성을 높입니다. 또한, WPF는 다양한 UI 컨트롤과 기능을 제공하기 때문에, 이러한 기능을 활용하여 사용자 경험(UX)을 개선할 수 있습니다. 단점으로는 MVVM 디자인 패턴의 학습 곡선과 코드의 양이 많아질 수 있다는 것이 있습니다. 하지만, 이러한 단점을 극복하면서도 WPF MVVM 디자인 패턴은 많은 개발자들이 선호하는 디자인 패턴 중 하나입니다.

728x90
반응형
LIST
728x90
반응형
LIST

소개

WPF(Windows Presentation Foundation)는 고급 그래픽 인터페이스를 갖는 데스크탑 애플리케이션을 만들 수 있게 해주는 UI 프레임워크입니다. 2006년 마이크로소프트에서 .NET Framework 3.0 일환으로 소개되었으며, 이후로 Windows 플랫폼에서 데스크탑 애플리케이션을 개발하는 데 가장 인기 있는 프레임워크 중 하나가 되었습니다. 이 블로그 포스트에서는 WPF의 세 가지 주요 기능을 살펴보겠습니다.

XAML

XAML(Extensible Application Markup Language)은 WPF 애플리케이션에서 UI 요소와 동작을 정의하는 데 사용되는 마크업 언어입니다. 이는 코드 대신 선언적으로 사용자 인터페이스를 디자인하고 유지 관리할 수 있게 해주는 XML 기반 언어입니다. XAML을 사용하면 창, 버튼 및 텍스트 상자와 같은 UI 요소의 레이아웃과 동작을 간단하고 직관적인 구문을 사용하여 정의할 수 있습니다.

데이터 바인딩

데이터 바인딩은 WPF의 강력한 기능 중 하나로, UI 요소를 데이터 소스에 직접 연결할 수 있습니다. 이는 데이터가 변경될 때 UI가 자동으로 새 값을 반영하도록 해줍니다. WPF에서의 데이터 바인딩은 유연하여 XML 파일, 데이터베이스 및 사용자 지정 개체를 포함한 다양한 데이터 소스에 바인딩할 수 있습니다. 이를 통해 데이터가 변경될 때 동적이고 반응적인 사용자 인터페이스를 만들 수 있습니다.

스타일 및 템플릿

WPF는 강력한 스타일링 및 템플릿 시스템을 제공하며 개발자가 애플리케이션의 외관과 느낌을 일관되고 재사용 가능한 방식으로 정의할 수 있습니다. 스타일은 글꼴, 색상 및 테두리와 같은 UI 요소의 시각적 속성을 정의하는 데 사용됩니다. 반면에 템플릿은 UI 요소의 구조와 레이아웃을 정의하는 데 사용됩니다. 스타일과 템플릿을 사용하여 개발자는 사용자 지정 외관과 느낌을 만들고 이를 여러 UI 요소에서 재사용할 수 있습니다.

결론

WPF는 개발자가 고급 그래픽 인터페이스를 갖는 데스크탑 애플리케이션을 만들기 위해 필요한 도구를 제공하는 강력하고 유연한 UI 프레임워크입니다. XAML, 데이터 바인딩 및 스타일 및 템플릿을 사용하여 개발자는 복잡하고 동적인 UI를 쉽게 디자인, 유지 관리 및 확장할 수 있습니다. 간단한 생산성 앱부터 복잡한 기업 애플리케이션까지, WPF는 데스크탑 개발에 대한 탁월한 선택입니다.

728x90
반응형
LIST
728x90
반응형
LIST

WPF에서 UI 접근 시, Cross Thread 피하기

WPF에서 UI 요소에 접근할 때, UI 스레드 이외의 다른 스레드에서 접근하면 Cross Thread 예외가 발생합니다. 이 문제를 해결하기 위해서는 다음과 같은 방법들을 사용할 수 있습니다.

1. Dispatcher.Invoke() 메서드 사용하기

Dispatcher.Invoke() 메서드를 사용하면, UI 스레드에서 해당 작업을 실행하도록 요청할 수 있습니다. 아래의 코드는 Dispatcher.Invoke() 메서드를 사용한 예시입니다.

Application.Current.Dispatcher.Invoke(() =>
{
    // UI 요소 조작 코드 작성
});

2. Dispatcher.BeginInvoke() 메서드 사용하기

Dispatcher.BeginInvoke() 메서드는 Dispatcher.Invoke()와 유사하지만, 비동기적으로 작업을 실행합니다. 아래의 코드는 Dispatcher.BeginInvoke() 메서드를 사용한 예시입니다.

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    // UI 요소 조작 코드 작성
}));

3. SynchronizationContext 사용하기

SynchronizationContext 클래스를 사용하면, 스레드 간 통신을 쉽게 할 수 있습니다. 아래의 코드는 SynchronizationContext를 사용한 예시입니다.

SynchronizationContext uiContext = SynchronizationContext.Current;
uiContext.Send(state =>
{
    // UI 요소 조작 코드 작성
}, null);

4. Task Scheduler 사용하기

Task Scheduler를 사용하면, 작업을 특정 스레드에서 실행할 수 있습니다. 아래의 코드는 Task Scheduler를 사용한 예시입니다.

TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
    // UI 요소 조작 코드 작성
}, CancellationToken.None, TaskCreationOptions.None, uiScheduler);

이러한 방법들 중에서 적절한 것을 선택하여 UI 스레드 이외의 스레드에서 UI 요소에 접근할 때, Cross Thread 예외를 피할 수 있습니다.

728x90
반응형
LIST
728x90
반응형
LIST
 


App.xaml 페이지에서 폼 작업 순서를 변경할수 있다.-StartupUri

 

WPF(기술,환경)
 - Windows Presentation Foundation
 - 윈폼 다음 버전
 - 아직은 0.2~0.3.. WPF 메인으로 사용.. 부족
 - 수업 : 애니메이션 사용(용도)
 - 윈폼(주) + WPF(부) = 어플리케이션
 - WPF 구현 = XAML(디자인) + C#(비즈니스코드)
 - WPF/Every
 - XAML(언어) : 디자인애니메이션이벤트
 - C#(언어) : 비즈니스코드
 
- WPF/Everywhere -> 진화 -> Silverlight

 

XAML

 - Extensible Application Markup Language
 
확장가능한 응용프로그램 마크업언어-
  
 선언적 프로그래밍 방식(********)
 
- WPF 기술을 구현하는 언어 
 
가독성
 
재물
 
화면구성이 가능하다최근 스마트폰에서 많이 사용하는 언어다.

 

WPF에서 컨트롤들이 자식 컨트롤을 가질때..

 -<Window>태그 :

       <Button>태그, 1(0), 2(X)

1. 자식을 단 1개만 가질 수 있는 컨트롤 : Content 속성

2. 자식을 1개 이상 가질 수 있는 컨트롤 : Items, Children, Dictionary 등 속성

 

Winform -> WPF

 - 100% X

 - Winform의 일부기능 + WPF의 독자적인 기능 : WPF

 

Label 텍스트 출력을 위해 많이 이용하는 컨트롤이다.

TextBlock 텍스트를(크기,글자체등조정할수 있는 컨트롤

 

Grid 도 패널중의 하나이다.

 

패널(Panel) : 다중 자식을 갖는 컨테이너 컨트롤(상자)

                   자기 자신은 화면에 표현 하지 않는다.

                   레이아웃 구성이 목적!!!(화면에 컨트롤 배치)

                   StackPanel, WrapPanel, Grid, UniformGrid, DockPanel, Canvas

 

StackPanel : 자식을 일렬로 배치

StackPanel overflow 시에는 화면상에서 보이지 않는다.

Orientation 속성 : 가로세로 정렬 위치 속성

HorizontalAlignment 속성 : 정렬 속성

WPF의 컨트롤 : 수평수직정렬의 값이 Strech값 기본(부모크기만큼 늘려라!!)

기본적으로 컨트롤들은 Strech값으로 지정 되어 있다.

 

WrapPanel:자동 개행이 된다윈도우 사이즈만큼 행이 조절된다

                이판넬도 윈도우 창사이즈가 맞지않을때 버튼이 짤려서 보이는 문제점이있다.

 

ScrollViewer : 윈도우 화면이 넘어가게 되면 자동으로 스크롤바가 생긴다이컨트롤은 안에 판넬속성을 부여해야 한다.

 

Canvas : 좌표를 지정해서 자식을 배치 : 애니메이션 적용시 활용애니메이션 효과를 사용할때 많이 사용한다.

Canvas.left,top,right : x, y축을 조절 할수 있다.

 

<Grid>활용도가 높고 권장도가 높은 컨트롤모눈종이/표 같은 형태, 1 1셀 형태이다.

<Grid.RowDefinitions>몇행을 사용할것이냐

<RowDefinition /> 갯수로 몇행을 사용할것인지 선언한다.

<Grid.ColumnDefinitions>

<ColumnDefinition /> 갯수로 몇 열을 사용할것인지 선언한다.

<Grid ShowGridLines="true">보이는패널 true로 설정시 가로 세로 줄을 보여라로 설정된다.

<Button Content="A" Grid.Row="0" Grid.Column="1"></Button> 이러한형태로 몇 행 몇열로 사용할지 지정해야한다.

 

<UniformGrid>자기의 자식갯수에 따라 행렬을 자기가 n/1로 나눠준다. Grid의 단순한 버젼 행 열 자동지정

<UniformGrid Rows="2">최소한 열의 갯수와 행의 갯수를 지정 할수 있다.

 

<DockPanel.xaml>한쪽으로 컨트롤을 채워 넣는 방식

<Button Content="A" DockPanel.Dock="Top,left,right" Height="50"/> : 남은공간을 다채워 주기 때문에 창의 크기도 달라져도 나머지 창을 채워 준다.

 

 

 

 

 내가 원한 설정 그대로 열리게 하기 위한 설정
 


Window

 

 

 

 


<Window x:Class="WPFEx.Test"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="하이 XAML" Height="200" Width="400">

       <Button Content="우와!!재물이다!" Height="100" Name="button1" Width="100" Click="button1_Click">

            

       </Button>

 

</Window>

<!--

       윈폼 : 비트맵 방식(눈에 보이는 크기만큼만 보인다.)

       재물 : 벡터 방식 으로 만든 이유(핸드폰, PDA, PC, TV : 이미지 품질이 그대로 이전된다)

       Window 태그의 안쪽에 Button를 기재 => Windows 컨트롤의 자식 컨트롤로서 Button 컨트롤을 추가

       WPF : WPF의 단위(수치) = 96분의 1인치 이다픽셀 단위가 아니다.

      

       Button, Window : Tag, Object Element

       Content, Width, Height : Attribute(속성)

       Content : Content Attribute

       Click : Event(Attribute)

-->

   using System; 

 

 


XAML

 

<Window x:Class="WPFEx.Test01"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="Test01" Height="300" Width="300" Name="window1" >

       <!--<Button Content="버튼"></Button>-->

       <!--<Button>버튼</Button>-->

 

       <!--Simple Type vs Complex Type-->

 

       <!--<Button>

             <Button.Content>

                    버튼

             </Button.Content>

       </Button>-->

 

       <!--<Button Content="버튼" Width="100"></Button>-->

       <!--<Button Content="버튼">

             <Button.Width>

                    100

             </Button.Width>

       </Button>-->

 

       <!-- <Button.Content> : 속성 엘리먼트 -->

       <!--<Button>

             <Button.Content>버튼</Button.Content>

             <Button.Width>100</Button.Width>

       </Button>-->

 

       <!--

             ** WPF의 특징

              : WPF는 모든 컨트롤이 모든 컨트롤의 자식이 될 수 있음!!

      

             Content 속성

             : 현재 엘리먼트의 자식 (컨트롤)

       -->

       <!--<Window.Content>

             <Button>

                    <Button.Content>

                           버튼

                    </Button.Content>

             </Button>

       </Window.Content>-->

 

      

             <!--<Button Content="버튼" Width="100" Height="100" Background="Yellow"></Button>-->

             <!--<Button Content="버튼" Width="100" Height="100">

                    <Button.Background>

                           <SolidColorBrush Color="Yellow" />

                    </Button.Background>

             </Button>-->

       <Window.Content>

             <Button Content="버튼" Width="100" Height="100">

                    <Button.Background>

                           <SolidColorBrush>

                                 <SolidColorBrush.Color>

                                        <Color R="255" G="255" B="0" A="255" />

                                 </SolidColorBrush.Color>

                           </SolidColorBrush>

                    </Button.Background>

             </Button>

 

       </Window.Content>

</Window>

<!--

       <Button Content="버튼"></Button> : Simple Type

       원형 : <Button><Button.Content>버튼</Button.Content><Button> : Complex Type

       단순한 타입복잡한 타입

       다양한 표현법이 존재한다.

       <Button.Content> : 자기가 가지고 있는 속성의 엘리먼트라고 불른다.

      

       **WPF의 특징 : WPF는 모든 컨트롤이 모든 컨트롤의 자식이 될수 있음

       Content 속성 : 현재 엘리먼트의 자식

      

       윈도우 > 버튼 > 버튼.콘텐트 형태로 계속 이어진다.

       최종 형태 : 생략되어 표현 할수 있다.

       <Window.Content>

             <Button>

                    <Button.Content>

                           버튼

                    </Button.Content>

             </Button>

       </Window.Content>

      

       Content="버튼" : String

       Width="100" : 숫자 형태는 모두 Double 형태이다.

      

       원형을 알고 있어야 하는 이유 : C#소스에서 원형을 알고 있어야 원하는 클래스에 접근하여 인스턴스를 생성하여 사용하기 위해서이다.

-->

 

 

CS 
 

 

 

using System.Collections.Generic;

using System.Linq;

using System.Text;

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 WPFEx

{

       /// <summary>

       /// Test01.xaml에 대한 상호 작용 논리

       /// </summary>

       public partial class Test01 : Window

       {

             public Test01()

             {

                    InitializeComponent();

             }

 

             private void window1_Loaded(object sender, RoutedEventArgs e)

             {

                    //컨트롤을 생성하는 방법

                    //1. XAML로 추가 : <Button>태그 사용

                    //2. C#으로 추가 : Button 클래스

 

                    //Button btn = new Button();

                    //btn.Width = 100;

                    //btn.Height = 100;

 

                    //윈도우 표현 : window1, this. Controls

                    //window1.Content = btn;

 

 

 

             }

       }

}

 

 
Alignment

 

 

 

 

 



<
Ellipse Stroke="Red" StrokeThickness="10" Fill="Yellow" MouseDown="Ellipse_MouseDown"></Ellipse>

 

 

XAML

<Window x:Class="WPFEx.Shape01"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="Shape01" Height="500" Width="500">

       <Ellipse Stroke="Red" StrokeThickness="10" Width="300" Height="300" Fill="Yellow" MouseDown="Ellipse_MouseDown"></Ellipse>

</Window>

<!--

       WPF의 도형

       : GDI+의 그리기가 버전업

       : 윈폼 + GDI + = WPF

-->

 

 
CS 
 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

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 WPFEx

{

       /// <summary>

       /// Shape01.xaml에 대한 상호 작용 논리

       /// </summary>

       public partial class Shape01 : Window

       {

             public Shape01()

             {

                    InitializeComponent();

             }

 

             private void Ellipse_MouseDown(object sender, MouseButtonEventArgs e)

             {

                    //이벤트 발생 주체 -> sender(윈폼)

                    //이벤트 발생 주체 -> sender(WPF)

                    //sender == Ellipse 객체 (O, X)

 

                    //e.OriginalSource

                    Ellipse ellipse = (Ellipse)e.Source;

                    ellipse.Fill = new SolidColorBrush(Colors.Blue);

             }

       }

}

 

  

 Alignment

 

 

 
 XAML

<Window x:Class="WPFEx.Alignment"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="Alignment" Height="300" Width="300" HorizontalContentAlignment="Left" VerticalContentAlignment="Top">

       <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">

       <Button Content="버튼" Width="100" Height="100"></Button>

       <!--<Button Content="버튼" HorizontalAlignment="Center" VerticalAlignment="Center"></Button>-->

       </StackPanel>

</Window>

<!--

       컨트롤 배치(정렬)

       1. Width : 너비

       2. Height : 높이

       3. HorizontalAlignment : 부모 영역에서의 본인 수평정렬(본인)

       4. VerticalAlignment : 부모 영역에서의 본인 수직정렬(본인)

       5. HorizontalContentAlignment : 내용물의 수평정렬(부모)

       6. VerticalContentAlignment : 내용물의 수직정렬(부모)

      

       모든 컨트롤들은 기본적으로 : Strech로 정렬 되어 있다.

      

-->

<script src="http://zzarungna.tistory.com/plugin/CallBack_bootstrapper?&src=http://s1.daumcdn.net/cfs.tistory/v/0/blog/plugins/CallBack/callback&id=81&callbackId=zzarungnatistorycom81503&destDocId=callbacknestzzarungnatistorycom81503&host=http://zzarungna.tistory.com&float=left&random=227">

728x90
반응형
LIST
728x90
반응형
LIST

 

컨트롤 템플릿 파트 이름  사용하는 타입 
 ComboBox


PART_Popup
PART_EditableTextBox
Popup 
TextBox
 DocumentViewer


PART_ContentHost
PART_FindToolBarHost 
ScrollViewer
ContentControl 
 FlowDocumentPageViewer PART_FindToolBarHost  Decorator 
 FlowDocumentReader


PART_ContentHost
PART_FindToolBarHost 
Decorator
Decorator
 FlowDocumentScrollViewer




PART_FindToolBarHost
PART_ToolBarHost
PART_ContentHost
Decorator
Decorator
ScrollViewer 
 Frame PART_FrameCP  ContentPresenter 
 GridViewColumnHeader


PART_HeaderGripper
PART_FloatingHeaderCanvas 
Thumb
Canvas 
 MenuItem PART_Popup  Popup 
 NavigationWindow PART_NavWinCP  ContentPresenter 
 PasswordBox PART_ContentHost  FrameworkElement 
 ProgressBar




PART_Track
PART_Indicator 
FrameworkElement
FrameworkElement 
 ScrollBar PART_Track  Track 
 ScrollViewer




PART_HorizontalScrollBar
PART_VerticalScrollBar
PART_ScrollContentPresenter 
ScrollBar
ScrollBar
ScrollContentPresenter 
 Slider


PART_Track
PART_SelectionRange 
Track
FrameworkElement 
 StickyNoteControl


















PART_CopyMenuItem
PART_CloseButton
PART_ResizeBottomRightThumb
PART_IconButton
PART_ContentControl
PART_TitleThumb
PART_PasteMenuItem
PART_InkMenuItem
PART_SelectMenuItem
PART_EraseMenuItem 
MenuItem
Button
Thumb
Button
Contentcontrol
Thumb
MenuItem
MenuItem
MenuItem
MenuItem 
 TabControl PART_SelectedContentHost  ContentPresenter 
 TextBoxBase PART_ContentHost  FrameworkElement 
 ToolBar PART_ToolBarPanel  ToolBarPanel 
 TreeViewItem  PART_Header  FrameworkElement
728x90
반응형
LIST
728x90
반응형
LIST
 속성 설명 
 BindsDirectlyToSource  기본 값은 False이며, True로 설정하면 DataSourceProvider 객체가 리턴하는 데이터 대신 DataSourceProvider 객체의 매개 변수를 바인딩하게 된다. 
 Converter  IValueConverter 인터페이스를 구현하여 데이터 원본으로부터 값을 변환하는 객체를 지정한다. 
 ConverterCulture  IValueConverter 인터페이스의 메소드에 선택적으로 전달되는 매개 변수로, 변환에 사용할 지역화 정보를 지정한다. 
 ConverterParameter  변환 과정에서 IValueConverter 객체의 메소드에 전달될 응용 프로그램에 특화된 선택적 매개 변수를 지정한다. 
 ElementName  데이터의 원본이 UI 요소면서 대상인 경우에 사용한다.
 FallbackValue  데이터 원본으로부터 값을 조회하는 작업이 실패하거나 여러 개의 Path 속성 중 하나가 null 이거나 비동기 바인딩시 값의 조회가 완료되지 않은 경우에 사용할 값을 지정한다.
 IsAsync  기본 값은 False이며, True로 설정하면 데이터 원본의 데이터를 비동기식으로 가져오거나 설정한다. 데이터가 조회 중인 동안에는 FallbackValue 속성 값을 이용해야 한다. 
 Mode  BindingMode 열거형 값 중 하나를 사용한다. TwoWay, OneWay, OneTime, OneWayToSource, Default 중 하나다. 
 NotifyOnSourceUpdated  기본 값은 False이며, SourceUpdated 이벤트의 발생 여부를 결정한다. 
 NotifyOnTargetUpdated  기본 값은 False이며, TargetUpdated 이벤트의 발생 여부를 결정한다. 
 NotifyOnValidationError  기본 값은 False이며, Validation.Error 결합 이벤트의 발생 여부를 결정한다. 
 Path  데이터 원본 객체의 데이터에 대한 경로. XML 데이터인 경우에는 XPath 속성을 사용한다. 
 RelativeSource  대상과 관련된 데이터 원본을 탐색할 때 사용한다. 
 Source  기본 데이터 콘텍스트 대신 사용도리 데이터 원본에 대한 참조를 지정한다.
 UpdateSourceExceptionFilter  데이터 원본을 업데이트하는 동안 에러가 발생할 경우 호출될 대리자를 지정하는 선택적 속성이다. ErrorValidationRule 속성과 함께 사용되는 경우에만 유효하다.
 UpdateSourceTrigger  대상 UI가 변경된 경우 데이터 원본이 언제 업데이트 될지를 결정한다. UpdateSourceTrigger 열거형을 사용하며, PropertyChanged, LostFocus, Explicit, Default 중 하나를 사용한다. 
 ValidationRule  ValidationRule 클래스로부터 파생된 객체를 지정한다. 
 XPath  XML 데이터 원본 객체의 데이터에 대한 XPath 값이다. XML 데이터가 아닌 경우에는 Path 속성을 사용한다. 
728x90
반응형
LIST
728x90
반응형
LIST

UI가 객체의 변화를 추적하는 안정적인 바업은 객체가 속성 값이 변경될 때마다 이벤트를 발생시키는 것입니다. 객체를 위해 해야 할 일은 InotifyPropertyChanged 인터페이스를 구현하는 것입니다.

 

 

 

Person 객체의 두 속성 값이 (생일 버튼의 Click 핸들러 메소드에 의해) 변경되면 Person 객체는 PropertyChanged 이벤트를 발생시킵니다. 

이 이벤트는 Person 객체가 제공하는 속성들과 UI 요소 간의 동기화를 위해 사용할 수 있습니다.

 

 

 

 

 

 

Person 객체는 응용 프로그램의 주 윈도우가 처음 만들어질 때 생성되며 Person 객체의 Name 과 Age 속성의 초기값에 사용자가 텍스트박스에 입력한 값이 적용이 되고 Person 객체의 변경 내용을 텍스트 박스에 업데이트 할 수 있도록 PropertyChanged 이벤ㅌ의 발생을 기다립니다.

생일 버튼의 Click 이벤트 핸들러는 Person 객체의 Age 속성 값이 변경될 때마다 텍스트 박스를 수동으로 수정하는 코드를 실행할 필요가 없어졌습니다. 대신 Age 속성 값이 변경되면 Person 객체의 변경 사항을 나이 텍스트 박스에 적용하는 이벤트가 발생하게 됩니다.

728x90
반응형
LIST
728x90
반응형
LIST

 

응용 프로그램의 UI를 간단하게 구현하기 위해 Person 클래스를 이용하도록 한다.

어느 정도 객체지향프로그래밍을 해보신 분이라면 이 클래스가 무슨 역할을 하는 지는 알 것이라 가정하고 설명은 생략한다....


 

 
이 코드는 Person 객체를 생성하고, 생일 버튼을 클릭하면 텍스트 박스의 값을 Person 객체의 속성 값으로 채우며 Person 객체의 Age 속성 값을 증가시키고 수정된 결과를 Person 객체의 데이터를 이용해 메시지 박스에 출력한다.
728x90
반응형
LIST
728x90
반응형
LIST

WPF 프로그래밍을 하다보면 문자열 텍스트를 Int형이나 어떠한 다른 형태의 자료형으로 형변환을 해야할 때를 접하게 될 것이다. (여기서는 string 문자열 -> Integer 정수형)

이럴 때 Int32.Parse() 를 써야할 것인지 Convert.ToInt32() 를 두고 고민하는 경우가 발생한다.

 

문자열의 기준으로 두 가지 방법의 차이점은 null 값의 처리이다.

 

Int32.Parse() 의 함수는 아래의 함수를 오버로드해서 사용하게 된다.

 

 

 public static int Parse(string s)
 {
      return int.Parse(s, NumberStyles.Integer, null);
 }

 

그럼 return 에서 다시 호출되는 함수를 보면 아래와 같다.

 

 public static int Parse(string s, NumberStyles style, IFormatProvider provider)
 {
     NumberFormatInfo info1 = NumberFormatInfo.GetInstance(provider);
     NumberFormatInfo.ValidateParseStyle(style);
     return Number.ParseInt32(s, style, info1);
 }

 

위와 같이 Int32.Parse() 함수를 쓰게 되면 위와 같은 과정을 거치는 것을 볼 수 있었다.

 

 

그렇다면 Convert.ToInt32() 를 사용하는 법을 파헤쳐 보자.

 

 public static int ToInt32(string value)
 {
     if (value == null)
        return 0;

     return int.Parse(value);
 }

 

여기서 중요한 점은 null 인 경우에 0을 반환해준다는 것이고, 그 다음 처리는 Int32.Parse() 와 동일한 처리과정을 거치게 된다는 것이다.

 

 

 

프로그래밍을 하다보면 예외처리가 중요하다. Int32.Parse() 와 같은 방법이 익숙해서 쓸 수도 있지만, 만들어진 프로그램에 null 값이 안들어온다는 보장이 없으므로 Convert.ToInt32() 와 같은 방법을 사용하여 예외처리를 해주는 습관이 필요할 것이다.

728x90
반응형
LIST

+ Recent posts