Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
WPFѧϰ֮ÉîÈëdz³ö»°ÃüÁî
 
×÷ÕߣºDarrenF À´Ô´£ºCSDN ·¢²¼ÓÚ£º2015-9-15
  3931  次浏览      27
 

WPFΪÎÒÃÇ×¼±¸ÁËÍêÉÆµÄÃüÁîϵͳ£¬Äã¿ÉÄÜ»áÎÊ£º¡°ÓÐÁË·ÓÉʼþΪʲô»¹ÐèÒªÃüÁîÏµÍ³ÄØ£¿¡±¡£Ê¼þµÄ×÷ÓÃÊÇ·¢²¼¡¢´«²¥Ò»Ð©ÏûÏ¢£¬ÏûÏ¢´«´ïµ½Á˽ÓÊÕÕߣ¬Ê¼þµÄÖ¸ÁîÒ²¾ÍËãÍê³ÉÁË£¬ÖÁÓÚÈçºÎÏìӦʼþËÍÀ´µÄÏûϢʼþ²¢²»×öÈκÎÏÞÖÆ£¬Ã¿¸ö½ÓÊÕÕß¿ÉÒÑÓÃ×Ô¼ºµÄÐÐΪÀ´ÏìӦʼþ¡£Ò²¾ÍÊÇ˵£¬Ê¼þ²»¾ßÓÐÔ¼ÊøÁ¦¡£ÃüÁîºÍʼþµÄÇø±ð¾ÍÔÚÓÚÃüÁî¾ßÓÐÔ¼ÊøÁ¦¡£

µÄÈ·£¬ÔÚʵ¼Ê±à³Ì¹¤×÷ÖУ¬¼´Ê¹Ö»ÓÃʼþ²»ÓÃÃüÁî³ÌÐòµÄÂß¼­Ò»Ñù±»Çý¶¯µÄºÜºÃ£¬µ«ÎÒÃDz»Äܹ»×èÖ¹³ÌÐòÔ±°´ÕÕ×Ô¼ºµÄϰ¹ßÈ¥±àд´úÂë¡£±ÈÈç±£´æÊ¼þµÄ´¦ÀíÆ÷£¬³ÌÐòÔ±¿ÉÒÔдSave()¡¢SaveHandle()¡¢SaveDocument()... ÕâЩ¶¼·ûºÏ´úÂë¹æ·¶¡£µ«³ÙÔçÓÐÒ»ÌìÕû¸öÏîÄ¿»á±äµÄÈÃÈËÎÞ·¨¶Á¶®£¬ÐÂÀ´µÄ³ÌÐòÔ±»òÐÞ¸ÄbugµÄ³ÌÐòÔ±»áºÜ×¥¿ñ¡£Èç¹ûʹÓÃÃüÁÇé¿ö¾Í»áºÃºÜ¶à----µ±SaveÃüÁîµ½´ïij¸ö×é¼þµÄʱºò£¬ÃüÁî»á×Ô¶¯È¥µ÷ÓÃ×é¼þµÄSave·½·¨¡£¶øÕâ¸ö·½·¨¿ÉÄܶ¨ÒåÔÚ»ùÀà»òÕß½Ó¿ÚÀ¼´±£Ö¤ÁËÕâ¸ö·½·¨ÊÇÒ»¶¨´æÔڵģ©£¬Õâ¾ÍÔÚ´úÂë½á¹¹ºÍÃüÃûÉÏ×öÁËÔ¼Êø¡£²»µ«Èç´Ë£¬ÃüÁ¿É¿ØÖƽÓÊÕÕß¡°ÏÈ×öУÑ飬ÔÙ±£´æ£¬×îºóÍ˳ö¡±£¬Ò²¾ÍÊÇ˵ÃüÁî³ýÁË¿ÉÒÔÔ¼Êø´úÂ룬»¹¿ÉÒÔÔ¼Êø²½ÖèÂß¼­£¬ÈÃÐÂÀ´µÄ³ÌÐòÔ±Ïë·¸´í¶¼ÄÑ£¬Ò²ÈÃÄǸöÐÞ¸ÄBugµÄ³ÌÐòÔ±ÈÝÒ×ÕÒµ½¹æÂÉ£¬ÈÝÒ×ÉÏÊÖ¡£

1.1 ÃüÁîϵͳµÄ»ù±¾ÔªËغ͹ØÏµ

WPFµÄÃüÁîϵͳÓɼ¸¸ö»ù±¾ÒªËع¹³É£¬ËüÃÇÊÇ£º

ÃüÁî(Command)£ºWPFµÄÃüÁîʵ¼ÊÉϾÍÊÇʵÏÖÁËICommand½Ó¿ÚµÄÀ࣬ƽʱʹÓÃ×î¶àµÄ¾ÍÊÇRoutedCommandÀà¡£ÎÒÃÇ»¹»áѧϰʹÓÃ×Ô¶¨ÒåÃüÁî¡£
ÃüÁîÔ´(Command Source)£º¼´ÃüÁîµÄ·¢ËÍÕߣ¬ÊÇʵÏÖÁËICommandSource½Ó¿ÚµÄÀà¡£ºÜ¶à½çÃæÔªËØ¶¼ÊµÏÖÁËÕâ¸ö½Ó¿Ú£¬ÆäÖаüÀ¨Button,ListBoxItem,MenuItemµÈ¡£

ÃüÁîÄ¿±ê(Command Target)£º¼´ÃüÁî·¢Ë͸øË­£¬»òÕß˵ÃüÁî×÷ÓÃÔÚË­µÄÉíÉÏ¡£ÃüÁîÄ¿±ê±ØÐëÊÇʵÏÖÁËIInputElement½Ó¿ÚµÄÀà¡£

ÃüÁî¹ØÁª(Command Binding)£º¸ºÔð°ÑһЩÍâΧÂß¼­ºÍÃüÁî¹ØÁªÆðÀ´£¬±ÈÈçÖ´ÐÐ֮ǰ¶ÔÃüÁîÊÇ·ñ¿ÉÒÔÖ´ÐнøÐÐÅжϡ¢ÃüÁîÖ´ÐÐÖ®ºó»¹ÓÐÄÄЩºóÐø¹¤×÷µÈ¡£

1.2 »ù±¾ÔªËØÖ®¼äµÄ¹ØÏµ

ÕâЩ»ù±¾ÔªËصĹØÏµÌåÏÖÔÚʹÓÃÃüÁîµÄ¹ý³ÌÖС£ÃüÁîµÄʹÓôó¸Å·ÖΪÒÔϼ¸²½£º

£¨1£©´´½¨ÃüÁîÀࣺ¼´»ñµÃÒ»¸öʵÏÖICommand½Ó¿ÚµÄÀ࣬Èç¹ûÃüÁîÓë¾ßÌåµÄÒµÎñÂß¼­ÎÞ¹ØÔòʹÓÃWPFÀà¿âÖеģ¨RoutedCommand£©À༴¿É¡£Èç¹ûÏëµÃµ½ÓëÒµÎñÂß¼­Ïà¹ØµÄרÓÐÃüÁÔòÐèÒª´´½¨RoutedCommand£¨»òÕßICommand½Ó¿Ú£©µÄÅÉÉúÀà¡£

£¨2£©ÉùÃ÷ÃüÃûʵÀý£ºÊ¹ÓÃÃüÁîʱÐèÒª´´½¨ÃüÁîÀàµÄʵÀý¡£ÕâÀïÓÐÒ»¸ö¼¼ÇÉ£¬Ò»°ãÇé¿öϳÌÐòÖÐijÖÖ²Ù×÷Ö»ÐèÒªÒ»¸öÃüÁîʵÀýÓëÖ®¶ÔÓ¦¼´¿É¡£±ÈÈç¶ÔÓ¦¡°±£´æ¡±Õâ¸öÃüÁî²Ù×÷¡£Òò´Ë³ÌÐòÖеÄÃüÁî¶àʹÓõ¥¼þģʽÒÔ¼õÉÙ´úÂëµÄ¸´ÔÓ¶È¡£

£¨3£©Ö¸¶¨ÃüÁîµÄÔ´£º¼´Ö¸¶¨ÓÉË­À´·¢ËÍÃüÁî¡£Èç¹û°ÑÃüÁî¿´×÷ÅÚµ¯£¬ÄÇôÃüÁîÔ´¾ÍÏ൱ÓÚ»ðÅÚ¡£Í¬Ò»¸öÃüÁî¿ÉÒÔÓжà¸öÔ´¡£±ÈÈç±£´æÃüÁ¼´¿ÉÒÔÓɲ˵¥Öеı£´æÏîÀ´·¢ËÍ£¬Ò²¿ÉÒÔÓɱ£´æ¹¤¾ßÀ¸ÖеÄͼ±ê½øÐз¢ËÍ¡£ÐèҪעÒâµÄÊÇ£¬Ò»µ©°ÑÃüÁîÖ¸ÅɸøÁËÃüÁîÔ´£¬ÄÇôÃüÁîÔ´¾Í»áÊÜÃüÁîµÄÓ°Ï죬µ±ÃüÁî²»Äܱ»Ö´ÐеÄʱºòÃüÁîÔ´µÄ¿Ø¼þ´¦ÓÚ²»¿ÉÓÃ״̬¡£¿´À´ÃüÁîÕâÖÖÅÚµ¯»¹ºÜÖÇÄÜ£¬µ±²»Âú×ã·¢ËÍÌõ¼þµÄʱºò»¹»á¸øÓÃÀ´·¢ÉäËüµÄ»ðÅÚÉÏÒ»µÀ±£ÏÕ¡¢±ÜÃâ×߻𡣻¹ÐèҪעÒ⣬¸÷Öֿؼþ·¢ËÍÃüÁîµÄ·½·¨²»¾­Ïàͬ£¬±ÈÈçButtonºÍMenuButtonÔÚµ¥»÷ʱ·¢ËÍÃüÁ¶øListBoxItemµ¥»÷ʱ±íʾ±»Ñ¡ÖУ¬Ë«»÷µÄʱºò²Å·¢ËÍÃüÁî¡£

£¨4£©Ö¸ÁîÃüÁîÄ¿±ê£ºÃüÁîÄ¿±ê²¢²»ÊÇÃüÁîµÄÊôÐÔ£¬¶øÊÇÃüÁîÔ´µÄÊôÐÔ¡£Ö¸¶¨ÃüÁîÄ¿±êÊǸæËßÃüÁîÔ´ÏòÄĸö×é¼þ·¢ËÍÃüÁî¡£ÎÞÂÛÕâ¸ö×é¼þÊÇ·ñÓµÓн¹µãËû¶¼»áÊÕµ½Õâ¸öÃüÁî¡£Èç¹ûûÓÐΪԴָ¶¨ÃüÁîÄ¿±ê£¬ÔòWPFϵͳÈÏΪµ±Ç°ÓµÓн¹µãµÄ¶ÔÏó¾ÍÊÇÃüÁîÄ¿±ê¡£Õâ¸ö²½ÖèÓеãÏñΪ»ðÅÚÖ¸¶¨Ä¿±ê¡£

£¨5£©ÉèÖÃÃüÁî¹ØÁª£ºÅÚ±øÊDz»Äܵ¥¶ÀÕ½¶·µÄ£¬¾ÍÏñÅÚ±øÔÚÉè¼ÆÖ®Ç°ÐèÒªÕì²ì±ø¹Û²ìµÐÇé¡¢ÅжϷ¢Éäʱ»ú£¬ÔÚÉä»÷ºó¹Û²âÉä»÷Ч¹û£¬°ïÖúÐÞÕýÒ»Ñù¡£WPFÃüÁîÐèÒªCommandBindingÔÚÖ´ÐÐ֮ǰÀ´°ïÖúÅжÏÊDz»ÊÇ¿ÉÒÔÖ´ÐС¢ÔÚÖ´Ðкó×öһЩÊÂÀ´¡°´òɨս³¡¡±¡£

ÔÚÃüÁîÄ¿±êºÍÃüÁî¹ØÁªÖ®¼ä»¹ÓÐһЩ΢ÃîµÄ¹ØÏµ¡£ÎÞÂÛÃüÁîÄ¿±êÊÇÓɳÌÐòÔ±Ö¸¶¨»¹ÊÇÓÉWPFϵͳ¸ù¾Ý½¹µãËùÔÚµØÅжϳöÀ´µÄ£¬Ò»µ©Ä³¸öUI×é¼þ±»ÃüÁîÔ´ÃéÉÏ£¬ÃüÁîÔ´¾Í»á²»¶ÏµÄÏòÃüÁîÄ¿±êͶʯÎÊ·£¬ÃüÁîÄ¿±ê¾Í»á²»Í£µÄ·¢ËͿɷÓɵÄPreviewCanExecuteºÍCanExecute¸½¼Óʼþ¡£Ê¼þ»áÑØUIÔªËØÊ÷ÏòÉÏ´«µÝ²¢±»ÃüÁî¹ØÁªËù²¶»ñ£¬ÃüÁî¹ØÁª»áÍê³ÉһЩºóÐøÈÎÎñ¡£±ðС¿´¡°ºóÐøÈÎÎñ¡±£¬¶ÔÓÚÄÇЩҵÎñÂß¼­Î޹صÄͨÓÃÃüÁÕâЩºóÐøÈÎÎñ²ÅÊÇ×îÖØÒªµÄ¡£

Äã¿ÉÄÜ»áÎÊ£º¡°ÃüÁîÄ¿±êÔõô»á·¢³öPreviewCanExecute¡¢CanExecute¡¢PreviewExecuteºÍExecutedʼþÄØ£¿¡±ÆäʵÕâ4¸öʼþ¶¼ÊǸ½¼Óʼþ£¬ÊDZ»CommandManagerÀà¡°¸½¼Ó¡±¸øÃüÁîÄ¿±êµÄ¡£´ó¼Ò¿ÉÒÔ·­¹ýÍ·À´ÔÙÀí½âһϸ½¼Óʼþ¡£ÁíÍ⣬PreviewCanExecuteºÍCanExecuteµÄÖ´ÐÐʱ»ú²»ÓɳÌÐòÔ±¿ØÖÆ£¬¶øÇÒÖ´ÐÐЧÂʱȽϸߣ¬Õâ²»µ«¸øÏµÍ³ÐÔÄÜ´øÀ´ÁËЩ½µµÍ£¬Å¼¶û»¹»áÒýÈ뼸¸öÒâÏë²»µ½µÄBUG²¢ÇұȽÏÄѵ÷ÊÔ£¬Çë´ó¼ÒÎñ±Ø¶à¼ÓСÐÄ¡£
ÏÂͼËùʾÊÇWPFÃüÁîϵͳ»ù±¾ÔªËصĹØÏµÍ¼£º

1.3 СÊÔÃüÁî

˵ÆðÀ´ºÜÈÈÄÖ£¬ÏÖÔÚÈÃÎÒÃǶ¯ÊÖʵ¼ùһϡ£ÊµÏÖÕâÑùÒ»¸öÐèÇ󣺶¨ÒåÒ»¸öÃüÁʹÓÃButtonÀ´·¢ËÍÕâ¸öÃüÁµ±ÃüÁîµ½´ïTextBoxµÄʱºò£¬TextBox»á±»Çå¿Õ£¨Èç¹ûTextBoxûÓÐÎÄ×Ö£¬ÃüÁî²»¿ÉÓᣣ©¡£

³ÌÐòXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window28"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window28" Height="300" Width="300" WindowStyle="ToolWindow">
<StackPanel Background="LightBlue" x:Name="sp1">
<Button Content="Send Command" x:Name="btn1" Margin="5"></Button>
<TextBox x:Name="txtA" Margin="5,0" Height="200"></TextBox>
</StackPanel>
</Window>

ºǫ́´úÂëΪ£º

using System;  
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes; namespace WpfApplication1
{
/// <summary>
/// Window28.xaml µÄ½»»¥Âß¼­
/// </summary>
public partial class Window28 : Window
{
public Window28()
{
InitializeComponent();
InitializeCommand();
}
//ÉùÃ÷²¢¶¨ÒåÃüÁî
private RoutedCommand rouutedCommand = new RoutedCommand("Clear",typeof(Window28));
private void InitializeCommand()
{
//°ÑÃüÁֵ¸øÃüÁîÔ´,²¢¶¨Òå¿ì½Ý¼ü
this.btn1.Command = rouutedCommand;
this.rouutedCommand.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt));
//Ö¸¶¨ÃüÁîÄ¿±ê
this.btn1.CommandTarget = txtA;

//´´½¨ÃüÁî¹ØÁª
CommandBinding commandBinding = new CommandBinding();
commandBinding.Command = rouutedCommand;//Ö»¹Ø×¢ÓërouutedCommandÏà¹ØµÄÃüÁî
commandBinding.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);
commandBinding.Executed += new ExecutedRoutedEventHandler(cb_Execute);
//°ÑÃüÁî¹ØÁª°²ÖÃÔÚÍâΧ¿Ø¼þÉÏ
this.sp1.CommandBindings.Add(commandBinding);
}
//µ±ÃüÁîµ½´ïÄ¿±êÖ®ºó£¬´Ë·½·¨±»µ÷ÓÃ
private void cb_Execute(object sender, ExecutedRoutedEventArgs e)
{
txtA.Clear();
//±ÜÃâʼþ¼ÌÐøÏòÉÏ´«µÝ¶ø½µµÍ³ÌÐòÐÔÄÜ
e.Handled = true;
}
//µ±Ì½²âÃüÁîÊÇ·ñ¿ÉÖ´ÐеÄʱºò¸Ã·½·¨»á±»µ÷ÓÃ
private void cb_CanExecute(object sender,CanExecuteRoutedEventArgs e)
{
if (string.IsNullOrEmpty(txtA.Text))
{
e.CanExecute = false;
}
else
{
e.CanExecute = true;
}
//±ÜÃâʼþ¼ÌÐøÏòÉÏ´«µÝ¶ø½µµÍ³ÌÐòÐÔÄÜ
e.Handled = true;
}

}
}

ÔËÐгÌÐò£¬ÔÚTextBoxÖÐÊäÈëÄÚÈÝÖ®ºó£¬ButtonÔÚÃüÁî¿ÉÖ´ÐÐ״̬ϱäΪ¿ÉÓ㬴Ëʱµ¥»÷°´Å¥»òÕß°´Alt+C£¬TextBox¾Í»á±»Çå¿Õ£¬Ð§¹ûÈçÏÂͼ£º

¶ÔÓÚÒÔÉϵĴúÂ룬ÐèҪעÒâÒÔϼ¸µã£º

µÚÒ»£¬Ê¹ÓÃÃüÁî¿ÉÒÔ±ÜÃâ×Ô¼ºÐ´´úÂëÅжÏButtonÊÇ·ñ¿ÉÒÔÓÃÒÔ¼°Ìí¼Ó¿ì½Ý¼ü¡£

µÚ¶þ£¬RountedCommandÊÇÒ»¸öÓëÒµÎñÂß¼­Î޹صÄÀֻ࣬¸ºÔðÔÚ³ÌÐòÖÐÅÜÍȶø²¢²»¶ÔÃüÁîÄ¿±ê½øÐвÙ×÷£¬TextBox²¢²»ÊÇÓÉËüÇå¿ÕµÄ¡£ÄÇôTextBoxµÄÇé¿ö²Ù×÷ÊÇË­ÄØ£¿´ð°¸ÊÇCommandBinding¡£ÒòΪÎÞÂÛÊÇ̽²âÃüÁîÊÇ·ñ¿ÉÒÔÖ´Ðл¹ÊÇÃüÁîËÍ´ïÄ¿±ê£¬¶¼»á¼¤·¢ÃüÁîÄ¿±ê·¢ËÍ·ÓÉʼþ£¬ÕâЩʼþ»áÑØ×ÅUIÔªËØÊ÷ÏòÉÏ´«µÝ£¬×îÖÕ±»CommandBindingËù²¶×½¡£±¾ÀýÖÐCommandBinding±»°²×°ÔÚÍâΧµÄStackPanelÉÏ£¬CommandbindingÕ¾Ôڸߴ¦ÆðÒ»¸öÕìÌýÆ÷µÄ×÷Ó㬶øÇÒרÃÅÕë¶ÔrouutedCommandÃüÁî²¶×½ÓëÆäÏà¹ØµÄʼþ¡£±¾ÀýÖУ¬µ±CommandBinding²¶×½µ½CanExecute¾Í»áµ÷ÓÃcb_CanExecute·½·¨¡£µ±²¶×½µ½ÊÇExecutedµÄʱºò£¬¾Íµ÷ÓÃcb_Executeʼþ¡£

µÚÈý£¬ÒòΪCanExecuteʼþµÄ¼¤·¢ÆµÂʱȽϸߣ¬ÎªÁ˱ÜÃâ½µµÍÐÔÄÜ£¬ÔÚ´¦ÀíÍê±ÏÖ®ºó½¨Ò齫e.HandleÉèÖÃΪtrue¡£

µÚËÄ£¬CommandBindingÒ»¶¨ÒªÉèÖÃÔÚÃüÁîÄ¿±êµÄÍâΧ¿Ø¼þÉÏ£¬²»È»ÎÞ·¨²¶×½CanExecuteºÍExecutedµÈ·ÓÉʼþ¡£

1.4 WPFÖеÄÃüÁî¿â

ÉÏÃæÕâ¸öÀý×ÓÖУ¬ÎÒÃÇ×Ô¼ºÉùÃ÷¶¨ÒåÁËÒ»¸öÃüÁ

private RoutedCommand rouutedCommand = new RoutedCommand("Clear",typeof(Window28)); 

ÃüÁî¾ßÓÐÒ»´¦ÉùÃ÷£¬´¦´¦Ê¹ÓõÄÌØµã£¬±ÈÈçSaveÃüÁÔÚ³ÌÐòµÄÈκεط½Ëü¶¼±íʾҪÇóÃüÁîÄ¿±ê±£´æÊý¾Ý¡£Òò´Ë£¬Î¢ÈíÔÚWPFÀà¿âÀïÃæ×¼±¸ÁËһЩ±ã½ÝµÄÃüÁî¿â£¬ÕâЩÃüÁî¿â°üÀ¨£º

ApplicationCommands

ComponentCommands

NavigationCommands

MediaCommands

EditingCommands

ËüÃǶ¼ÊǾ²Ì¬À࣬¶øÃüÁî¾ÍÊÇÓÉÕâЩ¾²Ì¬ÀàµÄÖ»¶ÁÊôÐÔÒÔµ¥¼þģʽ±©Â¶³öÀ´µÄ¡£ÀýÈ磺ApplicationCommandsÀà¾Í°üº¬CancelPrint¡¢Close¡¢ContextMenu¡¢Copy¡¢CorrectionList¡¢Cut¡¢Delete¡¢Find¡¢Help¡¢New¡¢NotACommand¡¢Open¡¢Paste¡¢Print¡¢PrintPreview¡¢Properties¡¢Redo¡¢Replace¡¢Save¡¢SaveAs¡¢SelectAll¡¢Stop¡¢UndoÕâЩÃüÁî¡£ËüÃǵÄÔ´´úÂëÈçÏ£º

ÆäËü¼¸¸öÃüÁî¿âÒ²ÓëÖ®ÀàËÆ¡£Èç¹ûÄãµÄ³ÌÐòÐèÒªÖîÈçOpen£¬Save£¬Stop£¬PlayµÈ±ê×¼ÃüÁÄǾÍûÓбØÒª×Ô¼ºÉùÃ÷ÁË£¬Ö±½ÓÄÃÃüÁî¿âÀ´ÓþͺÃÁË¡£

1.5 ÃüÁî²ÎÊý

Ç°ÃæÌáµ½µÄÃüÁî¿âÀïÃæÓкܶàWPFÔ¤ÖÆÃüÁÈçNew£¬Open£¬Copy£¬Cut£¬PasteµÈ¡£ÕâЩÃüÁî¶¼ÊÇApplicationCommandsÀàµÄ¾²Ì¬ÊôÐÔ£¬ËùÒÔËüÃǵÄʵÀýÓÀÔ¶Ö»ÄÜÓÐÒ»¸ö£¬Õâ¾ÍÒýÆðÁËÒ»¸öÎÊÌ⣺Èç¹û½çÃæÉÏÓÐÁ½¸ö°´Å¥Ò»¸öÓÃÀ´´´½¨Studentµµ°¸£¬Ò»¸öÓÃÀ´´´½¨Teacherµµ°¸¡£¶¼Ê¹ÓÃNewÃüÁîµÄ»°£¬³ÌÐòÓ¦¸ÃÈçºÎÇø±ðн¨µÄÊÇʲôµµ°¸ÄØ£¿

´ð°¸ÊÇʹÓÃCommandParameter£¬ÃüÁîÔ´Ò»¶¨ÊÇʵÏÖÁËICommandSource½Ó¿ÚµÄ¶ÔÏ󣬶øICommandSourceÓÐÒ»¸öÊôÐÔ¾ÍÊÇCommandParameter£¬Èç¹û°ÑÃüÁî¿´×÷·ÉÏòÄ¿±êµÄÅÚµ¯£¬ÄÇôCommandParameter¾ÍÏ൱ÓÚ×°ÔØÔÚÅÚµ¯ÀïÃæµÄ¡°ÏûÏ¢¡±¡£ÏÂÃæÊdzÌÐòµÄʵÏÖ´úÂë¡£

XAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window29"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window29" Height="278" Width="398">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="24" />
<RowDefinition Height="4" />
<RowDefinition Height="24" />
<RowDefinition Height="4" />
<RowDefinition Height="24" />
<RowDefinition Height="4" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!--ÃüÁîºÍÃüÁî²ÎÊý-->
<TextBlock HorizontalAlignment="Left" Name="textBlock1" Text="Name:" VerticalAlignment="Center" Grid.Row="0"/>
<TextBox x:Name="txtName" Margin="60,0,0,0" Grid.Row="0"></TextBox>
<Button Content="New Teacher" Grid.Row="2" Command="New" CommandParameter="Teacher"></Button>
<Button Content="New Student" Grid.Row="4" Command="New" CommandParameter="Student"></Button>
<ListBox Grid.Row="6" x:Name="lbInfos">

</ListBox>
</Grid>
<!--Ϊ´°ÌåÌí¼ÓCommandBinding-->
<Window.CommandBindings>
<CommandBinding Command="New" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed">

</CommandBinding>
</Window.CommandBindings>
</Window>

ÒÔÉÏ´úÂëÓÐÁ½¸öµØ·½ÐèҪעÒ⣺

Á½¸ö°´Å¥¶¼Ê¹ÓõÄÊÇNewÃüÁµ«·Ö±ðʹÓõÄÊÇStudentºÍTeacher×öΪµÄ²ÎÊý¡£

Õâ´ÎÊÇʹÓÃXAML´úÂëΪ´°ÌåÌí¼ÓCommandBinding£¬CommandbindingµÄCanExecuteºÍExecutedʼþ´¦ÀíÆ÷дÔÚºǫ́C#´úÂëÀ

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)  
{
if (string.IsNullOrEmpty(txtName.Text))
{
e.CanExecute = false;
}
else
{
e.CanExecute = true;
}
//·ÓÉÖÕÖ¹£¬Ìá¸ßϵͳÐÔÄÜ
e.Handled = true;
} private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
if (e.Parameter.ToString() == "Student")
{
this.lbInfos.Items.Add(string.Format("New Student:{0} ºÃºÃѧϰ£¬ÌìÌìÏòÉÏ¡£",txtName.Text));
}
else if(e.Parameter.ToString()=="Teacher")
{
this.lbInfos.Items.Add(string.Format("New Teacher:{0} ѧ¶ø²»Ñᣬ»åÈ˲»¾ë¡£", txtName.Text));
}
//·ÓÉÖÕÖ¹£¬Ìá¸ßϵͳÐÔÄÜ
e.Handled = true;
}

ÔËÐгÌÐò£¬µ±TextBoxÖÐûÓÐÄÚÈݵÄʱºò£¬Á½¸ö°´Å¥¶¼²»¿ÉÓ㻵±ÊäÈëÎÄ×Öºó°´Å¥±äΪ¿ÉÓ㬵¥»÷°´Å¥£¬ListBoxÖлáÌí¼Ó²»Í¬µÄÌõÄ¿£¬Ð§¹ûÈçÏÂͼ£º

1.6 ÃüÁîÓÚBinding½áºÏ

³õÊÔÃüÁÄã¿ÉÄÜ»áÏëµ½ÕâÑùÒ»¸öÎÊÌ⣬¿Ø¼þÄÇô¶àʼþ£¬¿ÉÒÔÈÃÎÒÃǽøÐи÷ÖÖ¸÷ÑùµÄ²»Í¬²Ù×÷£¬¿É¿Ø¼þÖ»ÓÐÒ»¸öCommandÊôÐÔ¡¢¶øÃüÁî¿âÈ´ÓÐÊý10ÖÖÃüÁÕâÑùÔõô¿ÉÄÜʹÓÃÕâ¸öΨһµÄCommandÊôÐÔÀ´µ÷ÓÃÄÇô¶àÖÖÃüÁîÄØ£¿´ð°¸ÊÇʹÓÃBIndding¡£Ç°ÃæÒѾ­Ëµ¹ý£¬Binding×÷ΪһÖÖ¼ä½ÓµÄ¡¢²»¹Ì¶¨µÄ¸³ÖµÊֶΣ¬¿ÉÒÔÈÃÄãÓлú»áÑ¡ÔñÔÚij¸öÌõ¼þÏÂΪĿ±ê¸³Ìض¨µÄÖµ£¨ÓÐʱºòÐèÒª½èÖúConverter£©¡£

ÀýÈçÒ»¸öButtonËù¹ØÁªµÄÃüÁîÓпÉÄܸù¾ÝijЩÌõ¼þ¶ø¸Ä±ä£¬ÎÒÃÇ¿ÉÒÔ°Ñ´úÂëд³ÉÕâÑù£º

<Button x:Name="cmdBtn" Command="{Binding Path=ppp, Source=sss}" Content="Command"></Button>  

²»¹ý»°ÓÖ˵»ØÀ´ÁË£¬ÒòΪ´ó¶àÊýÃüÁî°´Å¥¶¼ÓÐÏà¶ÔÓ¦µÄͼ±êÀ´±íʾ¹Ì¶¨µÄº¬Ò壬ËùÒÔÈÕ³£¹¤×÷ÖÐÒ»¸ö¿Ø¼þµÄÃüÁîÒ»¾­È·¶¨ºÜÉٸı䡣

2.0 ½ü¹ÛÃüÁî

Ò»°ãÇé¿öÏ£¬³ÌÐòÖÐʹÓÃÓÚÂß¼­Î޹صÄRoutedCommandÀ´ÅÜÅÜÁúÌ×¾Í×ã¹»ÁË£¬µ«ÎªÁËÈóÌÐòµÄ½á¹¹¸ü¼Ó¼ò½à£¨±ÈÈçÈ¥µôÍâΧµÄCommandBindingºÍÓëÖ®Ïà¹ØµÄʼþ´¦ÀíÆ÷£©£¬ÎÒÃdz£ÐèÒª¶¨Òå×Ô¼ºµÄÃüÁî¡£±¾½ÚÖÐÎÒÃÇ×ß½øWPFÃüÁÏÈÓÉRoutedCommandÈëÊÖ£¬ÔÙ´´½¨×Ô¼ºµÄÃüÁî¡£

2.1 ICommand½Ó¿ÚÓëRoutedCommand

WPFÖеÄÃüÁîÊÇʵÏÖÁËICommand½Ó¿ÚµÄÀà¡£ICommand½Ó¿Ú·Ç³£¼òµ¥£¬Ö»°üº¬Á½¸ö·½·¨ºÍÒ»¸öʼþ£º

Execute·½·¨£ºÃüÁîÖ´ÐУ¬»òÕß˵ÃüÁîÖ´ÐÐÓÚÃüÁîÄ¿±êÖ®ÉÏ¡£ÐèҪעÒâµÄÊÇ£¬ÏÖʵÊÀ½çÖеÄÃüÁîÊDz»»á×Ô¼ºÖ´Ðе쬶øÕâÀִÐбä³ÉÁËÃüÁîµÄ·½·¨£¬ÓеãÄâÈË»¯µÄζµÀ¡£

CanExecute·½·¨£ºÔÚÖ´ÐÐ֮ǰ֪̽ÃüÁîÊÇ·ñ¿ÉÒÔÖ´ÐС£

CanExecuteChangedʼþ£ºµ±ÃüÁîµÄ¿ÉÖ´ÐÐ״̬¸Ä±äµÄʱºò£¬¿É¼¤·¢´Ëʼþ֪ͨÆäËü¶ÔÏó¡£

RoutedCommand¾ÍÊÇÒ»¸öʵÏÖÁËICommand½Ó¿ÚµÄÀà¡£RoutedCommandÔÚʵÏÖICommand½Ó¿Úʱ£¬²¢Î´ÏòExecuteºÍCanExecute·½·¨ÖÐÌí¼ÓÈκÎÂß¼­£¬Ò²¾ÍÊÇ˵£¬ËüÊÇͨÓõġ¢Óë¾ßÌåµÄÒµÎñÂß¼­Î޹صġ£ÔõôÀí½â¡°Óë¾ßÌåµÄÒµÎñÂß¼­ÎÞ¹ØÕâ¾ä»°ÄØ¡±£¿ÎÒÃÇ´ÓÍⲿºÍÄÚ²¿Á½²¿·ÖÀ´Àí½â¡£

´ÔÍⲿÀ´¿´£¬ÎÒÃǻعËÒ»ÏÂApplicationCommandsÃüÁî¿âÀïµÄÃüÁîÃÇ£º

ËäÈ»ËüÃǶ¼ÓÐ×Ô¼ºµÄÃû×Ö£¬µ«ËüÃǶ¼ÊÇÆÕÆÕͨͨµÄRoutedUICommandʵÀý¡£Ò²¾ÍÊÇ˵£¬µ±Ò»¸öÃüÁîµ½´ïÃüÁîÄ¿±êÖ®ºó£¬¾ßÌåÖ´ÐÐCopy»òCut¼´ÒµÎñÂß¼­²»ÊÇÓÉÃüÁîÀ´¾ö¶¨µÄ£¬¶øÊÇÓÉÍâΧµÄCommandBinding²¶»ñµ½ÃüÁîÄ¿±êÊÜÃüÁ·¢¶ø·¢Ë͵Ä·ÓÉʼþºóÔÚÆäExecutedʼþ´¦ÀíÆ÷ÖÐÍê³ÉµÄ¡£»»¾ä»°Ëµ£¬¾ÍËãÄãµÄCommandBIndingÔÚ²¶×½µÄCopyÃüÁîºóÖ´ÐеÄÊÇÇå³ý²Ù×÷£¬Ò²ÓëÃüÁîÎ޹ء£

´ÓÄÚ²¿·ÖÎö£¬ÎÒÃǾÍÒª¿´¿´RoutedCommandµÄÔ´ÂëÁË¡£RoutedCommandÀàÓëÃüÁîÖ´ÐÐÏà¹ØµÄ´úÂë¼ò»¯ÈçÏ£º

ÔĶÁ´úÂëÎÒÃÇ¿ÉÒÔ·¢ÏÖ£¬´ÓICommand½Ó¿Ú¼Ì³ÐÀ´µÄExecute²¢Ã»Óб»¹«¿ª£¨ÉõÖÁ¿ÉÒÔ˵·ÏÆú²»ÓÃÁË£©£¬½ö½öÊǵ÷ÓÃÐÂÉùÃ÷µÄ´øÁ½¸ö²ÎÊýµÄExecute·½·¨£¬ÐÂÉùÃ÷µÄ´øÁ½¸ö²ÎÊýµÄExecute·½·¨ÊǶÔÍ⹫¿ªµÄ£¬¿ÉÒÔʹÓõÚÒ»¸ö²ÎÊýÏòÃüÁî´«µÝһЩÊý¾Ý£¬µÚ¶þ¸ö²ÎÊýÊÇÃüÁîµÄÄ¿±ê£¬Èç¹ûÄ¿±êΪnull£¬Execute¾Í»á°Ñµ±Ç°ÓµÓн¹µãµÄ¿Ø¼þµ±×÷×Ô¼ºµÄÄ¿±ê¡£ÐµÄExecute·½·¨»áµ÷ÓÃÃüÁîÖ´ÐÐÂß¼­µÄºËÐÄ----ExecuteImpl·½·¨£¨ExecuteImplÊÇExecute ImplementµÄËõд£©£¬¶øÕâ¸ö·½·¨ÄÚ²¿²¢Ã»ÓÐʲôÉñÃØµÄµØ·½£¬¼òÒª¶øÑÔ¾ÍÊÇ¡°½èÓá±ÃüÁîÄ¿±êµÄRaiseEvent°ÑRoutedEvent·¢ËͳöÈ¥¡£ÏÔÈ»Õâ¸öʼþ»á±»ÍâΧµÄCommandBInding²¶»ñÈ»ºóÖ´ÐгÌÐòÔ±Ô¤ÉèµÄÓëÒµÎñÂß¼­Ïà¹ØµÄ¶«Î÷¡£

×îºóÎÒÃÇÓÃButtonBaseΪÀýÀ´¿´¿´UIÔªËØÊÇÈçºÎ·¢ËÍÃüÁîµÄ¡£ButtonBaseÊÇÔÚClick·¢ÉúµÄʱºò·¢ËÍÃüÁîµÄ£¬¶øClickʼþµÄ¼¤·¢·ÅÔÚOnClick·½·¨ÀïÃæ£¬ButtonBaseµÄOnClick·½·¨ÈçÏ£º

Buttonµ÷ÓÃÁËÒ»¸ö.netframeWorkeÀïÃæµÄÄÚ²¿ÀࣨÕâ¸öÀàûÓÐÏò³ÌÐòÔ±±©Â¶£©CommandHelpersµÄExecuteCommandSource·½·¨£¬²¢°ÑButtonBase¶ÔÏó×Ô¼º×÷Ϊ²ÎÊý´«Á˽øÈ¥¡£Èç¹ûÎÒÃÇ×ß½øExecuteCommandSource·½·¨ÄÚ²¿»á·¢ÏÖÕâ¸ö·½·¨Êµ¼ÊÉÏÊǰɴ«½øÀ´µÄ²ÎÊýµ±×÷ÃüÁîÔ´¡¢µ÷ÓÃÃüÁîÔ´µÄExecuteCore·½·¨£¨±¾ÖÊÉÏÊǵ÷ÓÃÁËExecuteImpl·½·¨£©£¬»ñÈ¡ÃüÁîÔ´µÄCommandTargetÊôÐÔÖµ£¨ÃüÁîÄ¿±ê£©²¢Ê¹ÃüÁî×÷ÓÃÓÚÃüÁîÄ¿±êÖ®ÉÏ¡£

2.2 ÖÆ¶¨×Ô¶¨ÒåCommand

˵µ½×Ô¶¨ÒåÃüÁÎÒÃÇ¿ÉÒÔ·ÖΪÁ½¸ö²ã´ÎÀ´Àí½â¡£µÚÒ»¸ö²ã´Î±È½Ïdz£¬Ö¸µÄÊǵ±WPFÃüÁî¿âÀïÃæÃ»Óаüº¬ÏëÒªµÄÃüÁîʱ£¬ÎÒÃǾ͵ÃÉùÃ÷×Ô¼º¶¨ÒåµÄRoutedCommandʵÀý¡£±ÈÈçÄãÏëÈÃÃüÁîÄ¿±êÔÚÃüÁîµ½´ïʱ·¢³öЦÉù£¬WPFÃüÁî¿âÀïÃæÃ»ÓÐÕâ¸öÃüÁÄǾͿÉÒÔ×Ô¼º¶¨Ò»¸öLaughµÄRoutedCommandʵÀý¡£ºÜÄÑ˵ÕâÊÇÒ»ÖÖÕæÕýÒâÒåÉϵÄ×Ô¶¨ÒåÃüÁÕâÖ»ÊǶÔRoutedCommandµÄʹÓᣵڶþ¸ö²ã´ÎÊÇÖ¸´Ó¼Ì³ÐICommand½Ó¿Ú¿ªÊ¼£¬µÚÒ»×Ô¼ºµÄÃüÁî²¢°ÑijЩҵÎñÂß¼­°üº¬ÔÚÃüÁîÀÕâ²Å³ÆµÃÉÏÊÇÕæÕýÒâÒåÉϵÄ×Ô¶¨ÒåÃüÁî¡£µ«±È½Ï¼¬ÊÖµÄÊÇ£¬ÔÚWPFϵͳÖУ¬ÃüÁîÔ´£¨ButtonBase£¬MenuItem£¬ListBoxItem£¬Hyperlink£©¡¢RoutedCommandºÍCommandBindingÈýÕß»¥ÏàÒÀÀµµÄÏ൱½ôÃÜ¡£ÔÚÔ´Âë¼¶±ðÉÏ£¬²»µ«Ã»Óн«ÃüÁîÏà¹ØµÄ·½·¨ÉùÃ÷ΪVirtualÒÔ¹©ÎÒÃÇÖØÐ´£¬¶øÇÒ»¹ÓкܶàδÏò³ÌÐò¹«¿ªµÄÂß¼­£¨±ÈÈç¶ÔExecuteCoreºÍCanExecuteCoreÕâЩ·½·¨µÄÉùÃ÷ºÍµ÷Óã©¡£»»¾ä»°Ëµ£¬WPFÖеÄÃüÁîÔ´ºÍCommandBinding¾ÍÊÇרÃÅΪRoutedCommand±àдµÄ£¬Èç¹ûÎÒÃÇÏëʹÓÃ×Ô¼ºµÄICommandÅÉÉúÀà¾Í±ØÐëÁ¬ÃüÁîÔ´Ò»ÆðʵÏÖ£¨¼´ÊµÏÖIComamndSource½Ó¿Ú£©¡£Òò´ËΪÁ˼ò±ãµÄʹÓÃWPFÕâÌ׳ÉÊìµÄÌåϵ£¬ÎªÁ˸ü¸ßЧÂʵġ°´Ó0¿ªÊ¼¡±´òÔì×Ô¼ºµÄÃüÁîϵͳ£¬ÐèÒªÎÒÃǸù¾ÝÏîÄ¿µÄʵ¼ÊÇé¿ö½øÐÐȨºâ¡£

¼ÈÈ»±¾½ÚÃûΪ×Ô¶¨ÒåÃüÁÄÇôÎÒÃǾʹÓICommand½Ó¿Ú¿ªÊ¼£¬´òÔìÒ»¸ö´¿ÊÖ¹¤µÄ×Ô¶¨ÒåÃüÁî¡£

ΪÁ˼ò»¯CommandBindingÀ´´¦Àí³ÌÐòÒµÎñÂß¼­µÄ³ÌÐò½á¹¹£¬ÎÒÃÇ¿ÉÄÜÏ£Íû°ÑÒµÎñÂß¼­ÒÆÈëÃüÁîµÄExecute·½·¨ÄÚ¡£±ÈÈçÎÒÃÇ¿ÉÒÔ×Ô¶¨ÒåÒ»¸öSaveµÄÃüÁµ±ÃüÁîµ½´ïÃüÁîÄ¿±êµÄʱºòÏÈͨ¹ýÃüÁîÄ¿±êµÄIsChangedÊôÐÔÅжÏÃüÁîÄ¿±êµÄÀàÈÝÊÇ·ñÒѾ­¸Ä±ä£¬Èç¹û¸Ä±ä£¬ÃüÁî¿ÉÒÔÖ´ÐУ¬ÃüÁîÖ´ÐлáÖ±½Óµ÷ÓÃÃüÁîÄ¿±êµÄSave·½·¨£¬Çý¶¯ÃüÁîÄ¿±êÒÔ×Ô¼ºµÄÐÎʽȥ±£´æÊý¾Ý¡£ºÜÏÔÈ»£¬Õâ»ØÊÇÃüÁîÖ±½ÓÔÚÃüÁîÄ¿±êÉÏÆð×÷ÓÃÁË£¬¶ø²»ÏñRoutedCommandÄÇÑùÏÖÔÚÄ¿±êÉϼ¤·¢³ö·ÓÉʼþµÈÍâΧ¿Ø¼þÀ´²¶»ñµ½Â·ÓÉʼþÖ®ºó¡°·­¹ýÍ·À´¡±¶ÔÃüÁîÄ¿±ê¼ÓÒÔ´¦Àí¡£Äã¿ÉÄÜ»áÎÊ£¬Èç¹ûÃüÁîÄ¿±ê²»°üº¬IsChangedºÍSave·½·¨Ôõô°ì£¿Õâ¾ÍÒª¿¿½Ó¿ÚÀ´Ô¼ÊøÁË£¬±ÈÈçÎÒÃÇÔÚ³ÌÐòÖж¨ÒåÕâÑùÒ»¸ö½Ó¿Ú£º

public interface IView  
{
//ÊôÐÔ
bool IsChanged { get; set; }
//·½·¨
void SetBinding();
void Refresh();
void Clear();
void Save();
}

²¢ÇÒÒªÇóÿ¸ö½ÓÊÕÃüÁîµÄ×é¼þ±ØÐëʵÏÖÕâ¸ö½Ó¿Ú£¬ÕâÑù¿ÉÒÔÈ·±£ÃüÁî¿ÉÒÔ¶ÔÆä½øÐвÙ×÷¡£

½ÓÏÂÀ´ÎÒÃÇʵÏÖICommand½Ó¿Ú£¬´´½¨Ò»¸öרÃÅ×÷ÓÃÓÚIViewÅÉÉúÀàµÄÃüÁî¡£

/// <summary>  
///×Ô¶¨ÒåÃüÁî
/// </summary>
public class ClearCommand:ICommand
{
//ÓÃÀ´ÅжÏÃüÁîÊÇ·ñ¿ÉÒÔÖ´ÐÐ
public bool CanExecute(object parameter)
{
throw new NotImplementedException();
}
//µ±ÃüÁî¿ÉÖ´ÐÐ״̬·¢Ë͸ıäʱ£¬Ó¦µ±±»¼¤·¢
public event EventHandler CanExecuteChanged;

//ÃüÁîÖ´ÐÐʱ£¬´øÓÐÓëÒµÎñÏà¹ØµÄClearÂß¼­
public void Execute(object parameter)
{
IView view = parameter as IView;
if(view!=null)
{
view.Clear();
}
}
}

ÃüÁîʵÏÖÁËICommand½Ó¿Ú²¢¼Ì³ÐÁËCanExecuteChangedʼþ¡¢CanExecute·½·¨¡¢Execute·½·¨¡£Ä¿Ç°Õâ¸öÃüÁî±È½Ï¼òµ¥£¬Ö»Óõ½ÁËExecute·½·¨¡£ÔÚʵÏÖÕâ¸ö·½·¨Ê±£¬ÎÒÃǽ«Õâ¸ö·½·¨Î¨Ò»µÄ²ÎÊý×÷ΪÃüÁîµÄÄ¿±ê£¬Èç¹ûÄ¿±êÊÇIView½Ó¿ÚµÄÅÉÉúÀàÔòµ÷ÓÃÆäClear·½·¨---ÏÔÈ»ÎÒÃÇÒѾ­°Ñ³ÌÐòµÄÒµÎñÂß¼­ÒýÈëµ½ÁËÃüÁîµÄExecute·½·¨ÖС£

ÓÐÁË×Ô¶¨ÒåÃüÁÎÒÃÇʹÓÃʲôÃüÁîÔ´À´¡°·¢É䡱ËüÄØ£¿Ç°ÃæËµ¹ý£¬wpfÖеÄÃüÁîÔ´ÊÇרÃÅΪRoutedCommand×¼±¸µÄ²¢ÇÒ²»ÄÜÖØÐ´£¬ËùÒÔÎÒÃÇÖ»ÄÜͨ¹ýʵÏÖICommandSource½Ó¿ÚÀ´´´½¨×Ô¼ºµÄÃüÁîÔ´£¬´úÂëÈçÏ£º

/// <summary>  
/// MyCommandSource.xaml µÄ½»»¥Âß¼­
/// </summary>
public partial class MyCommandSource : UserControl,ICommandSource
{

/// <summary>
/// ¼Ì³Ð×ÔICommandµÄ3¸öÊôÐÔ
/// </summary>
public ICommand Command
{
get;
set;
}

public object CommandParameter
{
get;
set;
}

public IInputElement CommandTarget
{
get;
set;
}
//ÔÚÃüÁîÄ¿±êÉÏÖ´ÐÐÃüÁ»òÕß˵ÈÃÃüÁî×÷ÓÃÓÚÃüÁîÄ¿±ê
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
if(this.CommandTarget!=null)
{
this.Command.Execute(CommandTarget);
}
}
}

ICommand½Ó¿ÚÖ»°üº¬Command£¬CommandParameter£¬CommandTarget 3¸öÊôÐÔ£¬ÖÁÓÚÕâ3¸öÊôÐÔÖ±½ÓÓÐʲôÑùµÄ¹ØÏµ¾Í¿´ÎÒÃÇÒªÔõôȥʵÏÖÁË¡£ÔÚ±¾ÀýÖÐCommandParameterÍêȫûÓб»Óõ½£¬¶øCommandTarget×÷Ϊ²ÎÊý´«µÝ¸øÁËCommandµÄExecute·½·¨¡£ÃüÁî²»»á×Ô¼º±»·¢³ö£¬ËùÒÔÒ»¶¨ÒªÎªÃüÁîµÄÖ´ÐÐÑ¡ÔñÒ»¸öºÃµÄʱ»ú£¬±¾ÀýÖÐÎÒÃÇÔڿؼþ×óµ¥»÷µÄʱºòÖ´ÐÐÃüÁî¡£

ÏÖÔÚÃüÁîºÍÃüÁîÔ´¶¼ÓÐÁË£¬»¹²îÒ»¸öÃüÁîÄ¿±ê¡£Ó¦ÎªÎÒÃǵÄClearCommandרÃÅ×÷ÓÃÓÚIViewÅÉÉúÀ࣬ËùÒԺϸñµÄClearCommandÃüÁî±ØÐëʵÏÖIView½Ó¿Ú¡£Éè¼ÆÕâÖÖ¼ÈÓÐUIÓÖÐèҪʵÏÖ½Ó¿ÚµÄÀà¿ÉÒÔÏÈÓÃXAML±à¼­Æ÷ʵϰUI²¿·ÖÔÚתµ½ºǫ́ÓÃC#ʵÏÖ½Ó¿Ú£¬Ô­À´ºÜ¼òµ¥£¬WPF»á×Ô¶¯ÎªUIÔªËØÀàÌí¼Ópartial¹Ø¼ü×ÖÐÞÊΣ¬XAML´úÂë»á±»·­ÒëΪÀàµÄÒ»²¿·Ö£¬ºǫ́´úÂëÊÇÀàµÄÒ»²¿·Ö£¬ÎÒÃÇ¿ÉÒÔÔÚºǫ́´úÂ벿·Ö×Ô¶¨»ùÀà»òÕßʵÏÖ½Ó¿Ú£¬×îÖÕÕâЩ´úÂë»á±»±àÒëµ½Ò»Æð¡£

Õâ¸ö×é¼þµÄXAML²¿·ÖÈçÏ£º

<UserControl x:Class="WpfApplication1.MniView"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Border CornerRadius="5" BorderBrush="GreenYellow" BorderThickness="2">
<StackPanel>
<TextBox Margin="5" x:Name="txt1"></TextBox>
<TextBox Margin="5" x:Name="txt2"></TextBox>
<TextBox Margin="5" x:Name="txt3"></TextBox>
<TextBox Margin="5" x:Name="txt4"></TextBox>
</StackPanel>
</Border>
</UserControl>

ËüµÄºǫ́´úÂ벿·ÖÈçÏ£º

/// <summary>  
/// MniView.xaml µÄ½»»¥Âß¼­
/// </summary>
public partial class MniView : UserControl,IView
{
//¹¹ÔìÆ÷
public MniView()
{
InitializeComponent();
}
//¼Ì³Ð×ÔIViewµÄ³ÉÔ±ÃÇ
public bool IsChanged
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}

public void SetBinding()
{
throw new NotImplementedException();
}

public void Refresh()
{
throw new NotImplementedException();
}
/// <summary>
/// ÓÃÓÚÇå³ýÄÚÈݵÄÒµÎñÂß¼­
/// </summary>
public void Clear()
{
this.txt1.Clear();
this.txt2.Clear();
this.txt3.Clear();
this.txt4.Clear();
}

public void Save()
{
throw new NotImplementedException();
}
}

ÒòΪÎÒÃÇÖ»ÑÝʾClear·½·¨±»µ÷Óã¬ËùÒÔÆäËü¼¸¸ö·½·¨Ã»ÓоßÌåʵÏÖ¡£µ±Clear·½·¨±»µ÷ÓõÄʱºò£¬ËüµÄ¼¸¸öTextBox»á±»Çå¿Õ¡£

×îºó°Ñ×Ô¶¨ÒåÃüÁÃüÁîÔ´£¬ÃüÁîÄ¿±ê¼¯³ÉÆðÀ´£¬´°ÌåµÄXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window30"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window30" Height="300" Width="300" xmlns:my="clr-namespace:WpfApplication1">
<StackPanel>
<my:MyCommandSource x:Name="myCommandSource1">
<TextBlock Text="Çå³ý" Width="80" FontSize="16" TextAlignment="Center" Background="LightGreen"></TextBlock>
</my:MyCommandSource>
<my:MniView x:Name="mniView1" />
</StackPanel>
</Window>

±¾ÀýÖÐʹÓüòµ¥µÄÎı¾×÷ΪÃüÁîÔ´µÄÏÔʾÄÚÈÝ£¬Êµ¼Ê¹¤×÷ÖпÉÒÔʹÓÃͼ±ê£¬°´Å¥»òÕ߸ü¸´ÔÓµÄÄÚÈÝÀ´Ìî³äËü£¬µ«ÒªÊʵ±¸ü¸Ä¼¤·¢ÃüÁîµÄ·½·¨¡£²»È»Äã´òËãÔÚÀïÃæ·ÅÖÃÒ»¸ö°´Å¥£¬ÄÇô¾Í²»ÒªÓÃOnMouseLeftButtonDownµÄ·½·¨À´Ö´ÐÐÃüÁîÁË£¬¶øÓ¦¸Ã²¶»ñbuttonµÄClickʼþ²¢ÔÚʼþ´¦ÀíÆ÷ÖÐÖ´Ðз½·¨£¨Mouseʼþ»á±»Button³Ôµô£©¡£

ºǫ́C#´úÂ룺

/// <summary>  
/// Window30.xaml µÄ½»»¥Âß¼­
/// </summary>
public partial class Window30 : Window
{
public Window30()
{
InitializeComponent();
ClearCommand clearCommand = new ClearCommand();
this.myCommandSource1.Command = clearCommand;
this.myCommandSource1.CommandTarget = mniView1;
}
}

ÎÒÃÇÊ×ÏÈ´´½¨ÁËÒ»¸öClearCommandʵÀý²¢°ÑËü¸³Öµ¸ø×Ô¶¨ÒåÃüÁîÔ´µÄCommandÊôÐÔ£¬×Ô¶¨ÒåÃüÁîÔ´µÄCommandTargetÊôÐÔÄ¿±êÊÇMiniViewµÄʵÀý¡£ÌáÐÑÒ»¾ä£ºÎªÁ˽²½âÇåÎú²Å°ÑÃüÁî·ÅÔÚÕâÀÕý¹æµÄ·½·¨Ó¦¸ÃÊǰÑÃüÁîÉùÃ÷Ϊ¾²Ì¬È«¾ÖµÄµØ·½¹©ËùÓжÔÏóµ÷Óá£ÔËÐгÌÐò£¬ÔÚTextBoxÀïÊäÈëÈ»ºóÔÙµ¥»÷Çå³ý¿Ø¼þ£¬Ð§¹ûÈçÏÂͼ£º

ÖÁ´Ë£¬Ò»¸ö¼òµ¥µÄ×Ô¶¨ÒåÃüÁî¾ÍÍê³ÉÁË£¬ÈôÏëͨ¹ýCommandµÄCanExecute·½·¨À´Ó°ÏìÃüÁîÔ´µÄ״̬£¬»¹ÐèҪʹÓõ½ICommandºÍICommandSource½Ó¿ÚµÄ³ÉÔ±×é³É¸ü¸´ÔÓµÄÂß¼­¡£

   
3931 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ʹÓÃdecj¼ò»¯Webǰ¶Ë¿ª·¢
Web¿ª·¢¿ò¼ÜÐγÉÖ®ÂÃ
¸üÓÐЧÂʵÄʹÓÃVisual Studio
MVP+WCF+Èý²ã½á¹¹´î½¨¿ò¼Ü
ASP.NETÔËÐлúÖÆÇ³Îö¡¾Í¼½â¡¿
±àд¸üºÃµÄC#´úÂë
10¸öVisual Studio¿ª·¢µ÷ÊÔ¼¼ÇÉ

.NET¿ò¼ÜÓë·Ö²¼Ê½Ó¦Óüܹ¹Éè¼Æ
.NET & WPF & WCFÓ¦Óÿª·¢
UML&.Net¼Ü¹¹Éè¼Æ
COM×é¼þ¿ª·¢
.NetÓ¦Óÿª·¢
InstallShield

ÈÕÕÕ¸Û .NET Framework & WCFÓ¦Óÿª·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ
±±¾© .NetÓ¦ÓÃÈí¼þϵͳ¼Ü¹¹
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
ÈüÃÅÌú¿Ë C#Óë.NET¼Ü¹¹Éè¼Æ
¹ã¶«ºËµç .NetÓ¦ÓÃϵͳ¼Ü¹¹