이벤트 종류 & 명령 & 트리거
이벤트의 종류에는
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 차세대 개발 프로그래밍 - 책에서 일부 정리 함. ( 저작권 문제시 삭제 할 것임. )
자세한 내용은 책을 통해 확인하시길...