퇴근5분전

이벤트의 종류에는

 1. 직접 이벤트
 2. 이벤트 버블링
 3. 이벤트 터널링


- 직접 이벤트
  : 단일 컨트롤에 등록되는 이벤트 ( 기존 폼 같은... )

- 이벤트 터널링
  : 컨트롤의 비쥬얼 트리에서 이벤트를 발생시킨 컨트롤의 최상위 부모 컨트롤부터 관련 컨트롤까지 Preview 접두어가 명시된 이벤트가 차례로 처리되는 것

- 이벤트 버블링
 : 터널링이 끝난후 이벤트를 발생시킨 컨트롤로부터 부모컨트롤로 Preview 접두어가 명시되지 않은 이벤트가 차례로 발생 처리되는 것

모든 컨트롤에서 이벤트터널링과 이벤트 버블링이 발생하지 않는다.

명령( Command )
 : 특정 컨트롤에 종속적이지 않고 범용적으로 사용할수 있는 이벤트들이 있는데 ,
 잘라내기, 복사, 붙여넣기 등과 같은 이벤트가 대표적인 경우이다.

ICommand 인터페이스를 상속받은 클래스를 정의 한 후 이를 이용한다.

MyCommand.cs
namespace Evt_ICommand
{
    public class MyCommand : ICommand
    {
        #region ICommand 멤버

        public bool CanExecute(object parameter) // 명령을 실행가능한지.
        {
            return true;
        }

        public event EventHandler CanExecuteChanged; // 명령 값이 변화가 발생시...

        public void Execute(object parameter) // 명령처리
        {
            // 파라미터가 null값이 들어옴. ( Test중...)
            Application.Current.Shutdown();
        }

        #endregion
    }
}

Evt-Command.xaml.cs
        <Menu>
            <!-- 1번째 -->
            <MenuItem Header="종료">
                <MenuItem.Command>
                    <MyCommand xmlns="clr-namespace:Evt_ICommand"></MyCommand>
                </MenuItem.Command>
            </MenuItem>

            <!-- 2 번째 -->
            <MenuItem Command="ApplicationCommands.Paste" Header="붙여넣기">               
            </MenuItem>
        </Menu>
 
me: 이렇게 명령을 사용하니까... 명령별로 구분해서 만들고 이벤트대신 명령으로 컨트롤들에 공통 이벤트로 적용이 될만도 한데... 코딩이 좀더 들어갈듯... 좀더 고민해보면 응용이 필요한곳에 적절하게 사용할수 있을듯도 ...

책 Page 260 에 커맨드 종류가 나와있음. 이를 참고!!
  - ApplicationCommands
  - ComponentCommands
  - MediaCommands
  - NavigationCommands
  - EditingCommands

  2번째 명령을 적용해보니 다른 코딩없이 클립보드에서 데이타를 가져와서 붙여넣기가 되었음...


명령바인딩 
 해당 명령이 발생시 이 명령에 대한 별도의 작업을 처리하는 메서드를 호출가능하게 함.
window.xaml
<Window x:Class="Evt_ICommand.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Paste"
                        Executed="CommandBinding_Executed"
                        CanExecute="CommandBinding_CanExecute" >
        </CommandBinding>
    </Window.CommandBindings>
    <Grid>
        <Menu>
            <MenuItem Header="종료">
                <MenuItem.Command>
                    <MyCommand xmlns="clr-namespace:Evt_ICommand"></MyCommand>
                </MenuItem.Command>
            </MenuItem>
            <MenuItem Command="ApplicationCommands.Paste" Header="붙여넣기">               
            </MenuItem>
        </Menu>
        <TextBox Margin="0,21,0,0" Name="textBox1" TextWrapping="WrapWithOverflow"/>
    </Grid>
</Window>

window.xaml.cs
    /// <summary>
    /// Window1.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
//               명령에 대한 추가작업
                  MessageBox.Show("붙여넣기 실행!");          
        }
        private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
//             명령 사용여부
                e.CanExecute = true;
       
}
    }

음... 이게 좀 의문점이 있음.
커서가 TextBox안에 없을때 붙여넣기 메뉴 아이템을 클릭하면 메세지 박스가 실행되지만
TextBox에 커서가 위치된후 붙여넣기 메뉴 아이템 클릭시 메세지 박스가 실행이 안됨.
커서위치 해놓고 Ctrl+V를 눌러도 안됨.

트리거
 : 스타일에 조건을 명시해 적용시키는 데 사용한다.

    <Window.Resources>
        <Style TargetType="{x:Type MenuItem}">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Yellow"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

'메뉴아이템에 대한 스타일적용시 IsMouseOver 가 True이면 Background를 Yellow로 변경하여라'
라는 의미의 구문이 된다.

실제 적용해보면 마우스가 메뉴 아이템 위에 올라갔을시 바탕이 노란색으로 바뀌는 것을 볼수 있음.

WPF를 공부시 문법관련해서 외워서 칠 정도가 되려면 좀더 걸리겠다!!
처음 Asp.Net을 공부할때 HTML은 옛날 공부해둔덕에 그만한한 공부에 공들이는 시간을 줄일수 있었다지만.. 이건 뭐... 많긴 많다.


다중 트리거다중 조건 트리거는 책 267~269페이지 참조..

요약 : 다중트리거는 기존 트리거를 몇개 더 붙여놓는거였고...
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Yellow"></Setter>
                </Trigger>
             <Trigger Property="IsFocus" Value="True">
                    <Setter Property="Background" Value="Red"></Setter>
                </Trigger>
            </Style.Triggers>

다중 조건 트리거는 여러조건들이 맞아야 스타일을 적용하는 방법임.
 <MultiTriggers>
        <MultiTrigger.Conditions>
             <Condition Property="IsMouseOver" Value="True"/>
             <Condition Property="IsFocus" Value="True"/>
              ...
        </MultiTrigger.Conditions>
         <Setter  스타일 ... >   </Setter>
 </MultiTriggers>

이외에 이벤트 트리거라는것도 있다고 쓰여있음.





- 출처 : .Net 3.5 차세대 개발 프로그래밍 -  책에서 일부 정리 함. ( 저작권 문제시 삭제 할 것임. )
          자세한 내용은 책을 통해 확인하시길...

'# 3) .Net ( Vs 2008 ) > WPF' 카테고리의 다른 글

데이타바인딩(2)  (0) 2009.12.28
데이타바인딩(1)  (0) 2009.12.28
컨트롤  (0) 2009.12.28
스타일  (0) 2009.12.26
리소스  (0) 2009.12.26