WPF의 input 매커니즘 중 하나.
다음 두 개를 분리하기 위해 사용.
Action 실행가능한지 확인하기 위해 사용.
command, command source, command target, command binding이 command를 구성한다.
<StackPanel>
<Menu>
<MenuItem Command="ApplicationCommands.Paste"/>
</Menu>
<TextBox/>
</StackPanel>
주의할 점 : command target control이 항상 comamnd binding을 지원하는 것은 아니다. 보통 개발자가 구현해야 함.
WPF IComamnd interface를 구현하여 만든다.
ICommand는 다음 2개 메서드와 1개 이벤트 인터페이스를 갖고 있다.
Execute는 command와 관련한 action을 수행한다.
CanExecute는 현재 command target에 command 수행할 수 있는지 조사하여 결과를 리턴한다.
CanExecuteChanged는 변화가 있는 command source를 탐지하고 comamnd가 아직 실행되기 전에 불린다.
RoutedCommand 자체는 application logic을 갖고 있지 않다. 대신 routed event를 발생시키고 element tree를 따라 CommanddBinding을 만날때까지 이 이벤트를 전파한다.
CommandBinding은 이벤트 핸들러를 갖고 있다.
command를 발생시키는 object이다. object는 일반적으로 ICommandSource interface를 구현한다.
ICommandSource interface는 다음과 같다.
InputGesture는 comamnd와 어떤 동작을 연결한다.
InputGesture는 command source에 적용한다. wpf inputgesture에는 다음 두 가지가 있다.
<Window.InputBindings>
<KeyBinding Key="B"
Modifiers="Control"
Command="ApplicationCommands.Open" />
</Window.InputBindings>
이 외 다른 방법도 있다. 공식문서 참조
CommandBinding은 command와 command를 구현하는 이벤트 핸들러를 연결한다. 다음의 구성요소를 갖고 있다.
command가 동작할 element. ICommandSource의 CommandTarget은 ICommand가 RoutedCommand 일 때만 사용가능하다.
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open"
Executed="OpenCmdExecuted"
CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
<Grid>
<StackPanel>
<Button Name="pasteBtn"
Width ="50"
Command="ApplicationCommands.Open">paste</Button>
</StackPanel>
</Grid>
private void OpenCmdExecuted(object sender, ExecutedRoutedEventArgs e)
{
string command, targetobj;
command = ((RoutedCommand)e.Command).Name;
targetobj = ((FrameworkElement)e.Source).Name;
MessageBox.Show("The " + command + " command has benn invoked on target object " + targetobj);
}
private void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
참조 : Commanding Overview - WPF .NET Framework | Microsoft Docs
생성자에서 가상함수 부르면 안되는 이유 (0) | 2022.06.15 |
---|---|
[WPF] Dependency Property Metadata (0) | 2022.04.19 |
[WPF] Databinding (0) | 2022.04.18 |
[WPF] Pack uri (0) | 2022.04.15 |
c# (WPF) Data Binding 에 대해서 (0) | 2021.05.31 |
댓글 영역