這兩個方法可以在自訂控制項中建立內建WPF命令,比如WPF中TextBox內建複製,剪下,粘貼命令。其中RegisterClassInputBinding將一個命令和輸入筆勢(Input Gesture)聯絡在一起。這樣響應輸入筆勢發生後,命令邏輯會運行。而RegisterClassCommandBinding則將命令和具體命令執行邏輯和命令判斷邏輯聯絡起來。這樣一個命令就有具體邏輯執行代碼了。
下面自訂一個控制項,繼承與Button類型,使得按鈕中的文字支援剪下和粘貼。在自訂類型的靜態建構函式中用RegisterClassCommandBinding把剪下和粘貼的命令(對應ApplicationCommands類型的Cut和Paste屬性)執行實現。用RegisterClassInputBinding則定義命令執行的快速鍵。
代碼:
class MyButton : Button
{
static MyButton()
{
//使用CommandManager.RegisterClassCommandBinding和RegisterClassInputBinding方法
//註冊我們需要的剪下和粘貼命令。
CommandManager.RegisterClassCommandBinding(typeof(MyButton),
new CommandBinding(ApplicationCommands.Cut, OnCutCommand));
CommandManager.RegisterClassInputBinding(typeof(MyButton),
new InputBinding(ApplicationCommands.Cut, new KeyGesture(Key.X, ModifierKeys.Control)));
CommandManager.RegisterClassCommandBinding(typeof(MyButton),
new CommandBinding(ApplicationCommands.Paste, OnPasteCommand));
CommandManager.RegisterClassInputBinding(typeof(MyButton),
new InputBinding(ApplicationCommands.Paste, new KeyGesture(Key.V, ModifierKeys.Control)));
}
public MyButton()
{
Focusable = true;
Loaded += (ss, ee) => this.Focus();
}
//控制項內命令執行
protected virtual void OnCut()
{
Clipboard.SetText(Content.ToString());
Content = null;
}
protected virtual void OnPaste()
{
Content = Clipboard.GetText();
}
//CommandBinding命令綁定事件方法
private static void OnCutCommand(object sender, ExecutedRoutedEventArgs e)
{
var control = sender as MyButton;
if (control != null)
{
control.OnCut();
}
}
private static void OnPasteCommand(object sender, ExecutedRoutedEventArgs e)
{
var control = sender as MyButton;
if (control != null)
{
control.OnPaste();
}
}
}
然後在介面上,可以直接用Ctrl+X和Ctrl+V對按鈕內容進行剪下粘貼(當然前提是按鈕得有焦點),也可以用其他控制項(ICommandSource執行者)來觸發針對自訂按鈕的命令(通過設定ICommandSource.CommandTarget)。
XAML:
<StackPanel>
<loc:MyButton x:Name="mybtn" Height="50">Mgen!</loc:MyButton>
<Button Command="Cut" CommandTarget="{Binding ElementName=mybtn}">剪下</Button>
<Button Command="Paste" CommandTarget="{Binding ElementName=mybtn}">粘貼</Button>
</StackPanel>