WPF Commend 命令
WPF为我们准备了完善的命令系统,你可能会问:“有了路由事件为何还需要命令系统呢?”。事件的作用是发布、传播1些消息,消息转达到了接收者,事件的指令也就算完成了,至于如何响应事件送来的消息事件其实不做任何限制,每一个接收者可已用自己的行动来响应事件。也就是说,事件不具有束缚力。命令和事件的区分就在于命令具有束缚力。
1. WPF中命令的组成元素和元素之间的关系
下面直接给出其组成元素: ?命令源(Command Source)命令的发送者,现实了ICommandSource接口的类,实现此类的元素主要有ButtonBase,Hyperlink,MenuItem、ListBoxItem等 ?命令目标(Command Target)命令的接受者,实现了IInputElement接口的类。 ?命令关联(Command Binding)负责把外围的逻辑与命令关联起来。
b、声明命令实例 c、指明命令的源 d、指明命令的目标 e、设置命令关联
2. 小试命令
下面的例籽实现的是点击按钮时,清除文本框里面的内容。由于代码注释写的比较详细,直接给代码,然后具体再解释: XAML:
<Window x:Class="WpfApplication9.wnd913"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="200" Width="525">
<StackPanel x:Name="_stackPanel" Background="LightSlateGray">
<Button x:Name="_btnClear" Content="Clear" Height="28" Margin="5"/>
<TextBox x:Name="_txtBox" Height="120"/>
</StackPanel>
</Window>
C#:
public partial class wnd913 : Window
{
/// <summary>
/// 声明并定义命令
/// </summary>
private RoutedCommand _clearCmd = new RoutedCommand("clear",typeof(wnd913));
public wnd913()
{
InitializeComponent();
// 指定命令源与快捷键(输入笔势)
_btnClear.Command = _clearCmd;
_clearCmd.InputGestures.Add(new KeyGesture(Key.C,ModifierKeys.Alt));
// 指定命令目标
_btnClear.CommandTarget = _txtBox;
// 创建命令关联
CommandBinding cb = new CommandBinding();
cb.Command = _clearCmd;
cb.CanExecute += cb_CanExecute;
cb.Executed += cb_Executed;
// 命令关联安置到外围控件上
_stackPanel.CommandBindings.Add(cb);
}
void cb_Executed(object sender,ExecutedRoutedEventArgs e)
{
_txtBox.Clear();
// 履行终了
e.Handled = true;
}
void cb_CanExecute(object sender,CanExecuteRoutedEventArgs e)
{
if(string.IsNullOrEmpty(_txtBox.Text))
{
e.CanExecute = false;
}
else
{
e.CanExecute = true;
}
}
}
第1,使用命令可以免自己写代码判断Button是不是可以用和添加快捷键。
3. WPF命令库
命令具有1处声明,处处使用的特点,比如Save命令,在程序的任何地方它都表示要求命令目标保存数据。因此,微软在WPF类库里面准备了1些便捷的命令库,这些命令库包括:
这就引发了1个问题:如果界面上有两个按钮1个用来创建Student档案,1个用来创建Teacher档案。都使用New命令的话,程序应当如何区分新建的是甚么档案呢?
XAML:
<Window x:Class="WpfApplication9.wnd914"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="wnd914" Height="219.231" Width="300">
<StackPanel x:Name="_stackPanel" Margin="5">
<TextBox x:Name="_txtBox" Margin="5"/>
<Button x:Name="_btn1" Content="Teacher" Margin="5"/>
<Button x:Name="_btn2" Content="Student" Margin="5"/>
<ListBox x:Name="_listBox" Height="70" Margin="5"/>
</StackPanel>
</Window> C#:
public partial class wnd914 : Window
{
public wnd914()
{
InitializeComponent();
_btn1.Command = ApplicationCommands.New;
_btn1.CommandParameter = "Teacher";
_btn2.Command = ApplicationCommands.New;
_btn2.CommandParameter = "Student";
CommandBinding cb = new CommandBinding();
cb.Command = ApplicationCommands.New;
cb.CanExecute += cb_CanExecute;
cb.Executed += cb_Executed;
_stackPanel.CommandBindings.Add(cb);
}
void cb_Executed(object sender,ExecutedRoutedEventArgs e)
{
_listBox.Items.Add(e.Parameter.ToString());
}
void cb_CanExecute(object sender,CanExecuteRoutedEventArgs e)
{
if (string.IsNullOrEmpty(_txtBox.Text))
{
e.CanExecute = false;
}
else
e.CanExecute = true;
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |