理解命名 新特性:1、將事件委托到適當的命令 2、使控制項的啟用狀態和相應命令的狀態保持同步 命令:表示應用程式任務,並且跟蹤任務是否能夠被執行,然而,命令實際上不包含執行應用程式任務的代碼。 命令綁定:每個命令綁定針對用戶界面的具體區域,將命令連接到相關的應用程式邏輯。 命令源:命令源觸發命令。 命 ...
理解命名
新特性: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
Width="100"
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