理解命名
新特性:1、將事件委托到適當的命令 2、使控制元件的啟用狀態和相應命令的狀態保持同步
命令:表示應用程式任務,并且跟蹤任務是否能夠被執行,然而,命令實際上不包含執行應用程式任務的代碼,
命令系結:每個命令系結針對用戶界面的具體區域,將命令連接到相關的應用程式邏輯,
命令源:命令源觸發命令,
命令目標:執行命令的元素,
ICommand介面
WPF命令模型核心是System.Windows.Input.ICommand介面
public interface ICommand
{
event EventHandler CanExecuteChanged;
bool CanExecute(object parameter);
void Execute(object parameter);
}
Excute()方法包含應用程式任務邏輯,CanExecute()方法回傳命令的狀態,當命令可用時命令源啟用自身,不可用時禁用自身,具體實作可以參考MvvmLight原始碼,CommandManager.InvalidateRequerySuggested(); 重繪命令狀態,
RoutedCommand 和RoutedUICommand
RoutedCommand實作ICommand,target是處理事件的元素,
public bool CanExecute(object parameter, IInputElement target)
{
throw null;
}
public void Execute(object parameter, IInputElement target)
{
}
RoutedUICommand:RoutedCommand,應用程式處理的大部分命令是RoutedUICommand,
命令庫
WPF提供了一個基本命令庫,ApplicationCommands、NavigationCommands、EditingCommands、ComponentCommands、MediaCommands通過以上靜態類的靜態屬性提供,
ApplicationCommand.Open示例:
<!--XAML代碼實作-->
<!--<Window.InputBindings>
<KeyBinding
Key="O" Command="ApplicationCommands.Open"
Modifiers="Ctrl" />
</Window.InputBindings>-->
<Window.CommandBindings>
<CommandBinding
CanExecute="CommandBinding_CanExecute"
Command="ApplicationCommands.Open"
Executed="CommandBinding_Executed" />
</Window.CommandBindings>
<Grid>
<StackPanel>
<Button
Height="20"
Command="ApplicationCommands.Open"
Content="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Command.Text}" />
</StackPanel>
</Grid>
代碼實作為:
//C#代碼實作
//KeyBinding keyBinding = new KeyBinding(ApplicationCommands.Open, Key.O, ModifierKeys.Control);
//this.InputBindings.Add(keyBinding);
CommandBinding commandBinding = new CommandBinding(ApplicationCommands.Open, CommandBinding_Executed, CommandBinding_CanExecute);
this.CommandBindings.Add(commandBinding);
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show(e.Source.ToString());
}
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
通過觀察彈出視窗資訊,可以知道通過點擊按鈕彈出和快捷鍵彈出的命令源是不同的,分別button和window,命令庫中的一些命令可以被自動映射到指定的組合鍵,如ApplicationCommands.Open被映射到Ctrl+O組合鍵,
WPF命令庫命令可以簡寫為
<Button Command="Open"/>
命令源
實作ICommandSource介面的物件
public interface ICommandSource
{
//指向鏈接的命令
ICommand Command {get;}
//命令引數
object CommandParameter {get; }
//執行命令的元素
IInputElement CommandTarget {get;}
}
內置命令的控制元件
例如,TextBox類處理Cut、Copy、Paste命令以及來自EditingCommand的一些命令,ToolBar和Menu控制元件可以將它的子元素的CommanTarget屬性自動設定為具有焦點的空間,其他容器中則要手動設定CommandTarget屬性,或者使用FocusManager.IsFocusScope附加屬性,
<Button Command="Copy" CommandTarget="{Binding ElementName=textBox}" />
<!--FocusManager.IsFocusScope 在父元素的焦點范圍中查找-->
<StackPanel FocusManager.IsFocusScope="True">
<Button Command="Cut" />
<Button Command="Copy" />
<Button Command="Paste" />
</StackPanel>
內置屬性控制元件可以通過IsUndoEnable屬性來移除內置命令,或者通過CommandBinding和KeyBindind來禁用命令,
本文來自博客園,作者:藍白永恒,轉載請注明原文鏈接:https://www.cnblogs.com/wzmcnblogs/p/16183586.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462831.html
標籤:.NET技术
下一篇:C#中檢查null的語法糖
