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

1Ôª 10Ôª 50Ôª





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



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

ͼÐÎÓû§½çÃæÓ¦ÓóÌÐò½ÏÖ®¿ØÖÆÌ¨½çÃæÓ¦ÓóÌÐò×î´óµÄºÃ´¦¾ÍÊǽçÃæÓѺá¢Êý¾ÝÏÔʾֱ¹Û¡£CUI³ÌÐòÖÐÊý¾ÝÖ»ÄÜÒÔÎı¾µÄÐÎʽÏßÐÔÏÔʾ£¬GUI³ÌÐòÔòÔÊÐíÊý¾ÝÒÔÎı¾¡¢ÁÐ±í¡¢Í¼ÐεȶàÖÖÐÎʽÁ¢ÌåÏÔʾ¡£

Óû§ÌåÑéÔÚGUI³ÌÐòÉè¼ÆÖÐÆðמÙ×ãÇáÖØµÄ×÷ÓÃ-----Óû§½çÃæÉè¼Æ³ÉʲôÑù¿´ÉÏÈ¥²Å×ã¹»µÄƯÁÁ£¿¿Ø¼þÈçºÎ°²ÅŲżòµ¥Ò×Óò¢ÇÒÉÙ·¸´íÎó£¿ÕâЩ¶¼ÊÇÉè¼ÆÊ¦ÐèÒª¿¼ÂǵÄÎÊÌâ¡£WPFϵͳ²»µ«Ö§³Ö´«Í³µÄWinfrom±à³ÌµÄÓû§½çÃæºÍÓû§ÌåÑéÉè¼Æ£¬¸üÖ§³ÖʹÓÃרÃŵÄÉè¼Æ¹¤¾ßBlend½øÐÐרҵÉè¼Æ£¬Í¬Ê±»¹ÍƳöÁËÒÔÄ£°åΪºËÐĵÄÐÂÒ»´úÉè¼ÆÀíÄî¡£

1.1 Ä£°åµÄÄÚº­

´Ó×ÖÃæÉÏ¿´£¬Ä£°å¾ÍÊÇ¡°¾ßÓÐÒ»¶¨¹æ¸ñµÄÑù°å¡±£¬ÓÐÁËËü£¬¾Í¿ÉÒÔÒÀÕÕËüÖÆÔìºÜ¶àÒ»ÑùÊÇʵÀý¡£ÎÒÃdz£°Ñ¿´ÆðÀ´Ò»ÑùµÄ¶«Î÷³ÆÎª¡°Ò»¸öÄ£×ÓÀïÃæ¿Ì³öÀ´µÄ¡£¡±¾ÍÊÇÕâ¸öµÀÀí¡£È»¶ø£¬WPFÖеÄÄ£°åµÄÄÚº­Ô¶±ÈÕâ¸öÉî¿Ì¡£

BindingºÍ»ùÓÚBindingÊý¾ÝÇý¶¯UIÊÇWPFµÄºËÐIJ¿·Ö£¬WPF×²ÊµÄ²¿·ÖÊÇÊ²Ã´ÄØ£¿ÒÀÎÒ¿´£¬¼È²»ÊÇÃÀÂÖÃÀÛ¼µÄ3DͼÐΣ¬Ò²²»ÊÇìÅÄ¿¶à²ÊµÄ¶¯»­£¬¶øÊÇĬĬÎÞÎŵÄÄ£°å£¨Template£©¡£Êµ¼ÊÉÏ£¬¾ÍÁ¬2D/3D»æÍ¼Ò²³£³£ÊÇΪËü½õÉÏÌí»¨¡£

Templdate¾¿¾¹ÓÐʲôÄÜÁ¦Äܹ»Ê¹µÃËüÔÚWPFÌåϵÖлñ´ËÊâÈÙÄØ£¿Õ⻹Ҫ´ÓÕÜѧ̸Æð£¬¡°ÐζøÉÏÕßν֮µÀ£¬ÐζøÏÂÕßν֮Æ÷¡±£¬Õâ¾ä»°³ö×Ô¡¶Ò×¾­¡·£¬´óÒâÊÇÎÒÃÇÄܹ»¹Û²ìµ½µÄÊÀ¼äÍòÎïÐÎÏóÖ®ÉϵijéÏóµÄ½á¹û¾ÍÊÇ˼ά£¬¶øÐÎÏóÖ®ÏÂÑڸǵľÍÊÇÆä±¾ÖÊ¡£ÏÔÈ»£¬¹ÅÈËÒѾ­×¢Òâµ½¡°ÐΡ±ÊÇÁ¬½Ó±¾ÖʺÍ˼άµÄÊàŦ£¬ÈÃÎÒÃǰÑÕâ¾ä»°ÒýÈë¼ÆËã»úÊÀ½ç¡£

¡°ÐζøÉÏÕßν֮µÀ¡±Ö¸µÄ¾ÍÊÇ»ùÓÚÏÖʵÊÀ½ç¶ÔÍòÎï½øÐгéÏó·â×°£¬Àí˳ËüÃÇÖ®¼äµÄ¹ØÏµ£¬Õâ¸ö¡°µÀ¡±²»¾ÍÊÇÃæÏò¶ÔÏó˼ÏëÂð£¡Èç¹ûÔÙ°ÑÃæÏò¶ÔÏó½øÒ»²½ÌáÉý¡¢×ܽá³ö×îÓŵĶÔÏó×éºÏ¹ØÏµ£¬¡°µÀ¡±¾ÍÉÏÉýΪÉè¼ÆÄ£Ê½Ë¼Ïë¡£

¡°ÐζøÏÂÕßÎ½Ö®Æø¡±Ö¸µÄÊÇÎÒÃÇÄܹ»¹Û²ìµ½µÄÊÀ¼äÍòÎï¶¼ÊÇÎïÖÊÀàÈݵı¾ÖʱíÏÖÐÎʽ¡£¡°±¾ÖÊÓë±íÏÖ¡±»òÕß˵¡°ÀàÈÝÓëÐÎʽ¡±ÊÇÕÜѧ·¶³ëÄÚµÄÒ»¶Ôì¶ÜÌå¡£

Èí¼þÖ®µÀ²¢·Ç±¾ÊéÑо¿µÄÖ÷ÒªÀàÈÝ£¬±¾ÊéÑо¿µÄÊÇWPF¡£WPFÈ«³ÆWindows Presentation Foundation£¬PresentationÒ»´ÊµÄÒâ˼¾ÍÊÇÍâ¹Û£¬³ÊÏÖ£¬±íÏÖ£¬Ò²¾ÍÊÇ˵£¬ÔÚWIndows GUI³ÌÐòÕâ¸ö³ß¶ÈÉÏ£¬WPF°çÑݵľÍÊÇ¡°ÐΡ±µÄ½ÇÉ«¡¢ÊdzÌÐòµÄÍâÔÚÐÎʽ£¬¶ø³ÌÐòµÄÄÚÈÝÈÔÈ»ÊÇÓÉÊý¾ÝºÍËã·¨¹¹³ÉµÄÒµÎñÂß¼­¡£ÓëWPFÀàËÆ£¬WinformºÍAsp.netÒ²¶¼ÊÇÄÚÈݵıíÏÖÐÎʽ¡£

ÈÃÎÒÃǰѳ߶ÈËõСµ½WPFÄÚ²¿¡£Õâ¸öϵͳÓë³ÌÐòÄÚÈÝ£¨ÒµÎñÂß¼­£©µÄ±ß½çÊÇBinding£¬Binding°ÑÊý¾ÝÔ´Ô´²»¶Ï´Ó³ÌÐòÄÚ²¿ËͳöÀ´½»ÓɽçÃæÔªËØÀ´ÏÔʾ£¬ÓÖ°Ñ´Ó½çÃæÔªËØËѼ¯µ½µÄÊý¾Ý´«»Ø³ÌÐòÄÚ²¿¡£½çÃæÔªËØ¼äµÄ¹µÍ¨ÔòÒÀ¿¿Â·ÓÉʼþÀ´Íê³É¡£ÓÐʱºò·ÓÉʼþºÍ¸½¼ÓʼþÒ²»á²ÎÓëµ½Êý¾ÝµÄ´«ÊäÖС£ÈÃÎÒÃÇ˼¿¼Ò»¸öÎÊÌ⣺WPF×÷ΪWindowsµÄ±íʾ·½Ê½£¬Ëü¾¿¾¹±íʾµÄÊÇʲô£¿»»¾ä»°Ëµ£¬WPF×÷ΪһÖÖ¡°ÐÎʽ¡±£¬Ëü±íÏÖµÄÄÚÈݵ½µ×ÊÇʲô£¿´ð°¸ÊdzÌÐòµÄÊý¾ÝºÍËã·¨----Binding´«µÝµÄÊÇÊý¾Ý£¬Ê¼þ²ÎÊýЯ´øµÄÒ²ÊÇÊý¾Ý£»·½·¨ºÍίÍеĵ÷ÓÃÊÇËã·¨£¬Ê¼þ´«µÝÏûÏ¢Ò²ÊÇËã·¨----Êý¾ÝÔÚÄÚ´æÀï¾ÍÊÇÒ»´®´®×Ö·û»ò×Ö·û¡£Ëã·¨ÊÇÒ»×é×é¿´²»¼ûÃþ²»×ŵijéÏóÂß¼­£¬ÈçºÎÇ¡ÈçÆä·ÖµÄ°ÑËüÃÇÕ¹ÏÖ¸øÓû§ÄØ£¿

¼ÓÈëÏë±í´ïÒ»¸öboolÀàÐÍ£¬Í¬Ê±»¹Ïë±í´ïÓû§¿ÉÒÔÔÚÕâÁ½¸öÖµÖ®¼ä×ÔÓÉÇл»ÕâÑùÒ»¸öËã·¨£¬Äã»áÔõô×ö£¿ÄãÒ»¶¨»áÏëʹÓÃÒ»¸öCheckBox¿Ø¼þÀ´Âú×ãÒªÇó£»ÔÙ±ÈÈçÑÕɫֵʵ¼ÊÉÏÊÇÒ»´®Êý×Ö£¬Óû§»ù±¾Éϲ»¿ÉÄÜÖ»¿´Êý×Ö¾ÍÄÜÏëÏó³öÕæÕýµÄÑÕÉ«£¬¶øÇÒÓû§Ò²²»Ï£ÍûÖ»¿¿ÊäÈë×Ö·ûÀ´±íʾÑÕɫֵ£¬Õâʱ£¬ÑÕɫֵÕâÒ»¡°Êý¾ÝÄÚÈÝ¡±µÄÇ¡µ±±íÏÖÐÎʽ¾ÍÊÇÒ»¸öÌî³ä×ÅÕæÊµÑÕÉ«µÄÉ«¿é¡££¬¶øÓû§¼´¿ÉÒÔÊäÈëÖµÓÖ¿ÉÒÔÓÃȡɫÎü¹ÜȡɫÀ´ÉèÖÃÖµµÄ¡°Ëã·¨ÄÚÈÝ¡±Ç¡µ±µÄ±í´ï·½Ê½ÊÇ´´½¨Ò»¸öColorPicker¿Ø¼þ¡£ÏàÐÅÄãÒѾ­·¢ÏÖ£¬¿Ø¼þ£¨Control£©ÊÇÊý¾ÝÄÚÈݱíÏÖÐÎʽµÄË«ÖØÔØÌå¡£»»¾ä»°Ëµ£¬¿Ø¼þ¼´ÊÇÊý¾ÝµÄ±íÏÖÐÎʽÈÃÓû§¿ÉÒÔÖ±¹ÛµÄ¿´µ½Êý¾Ý£¬ÓÖÊÇËã·¨µÄ±íÏÖÐÎʽÈÃÓû§·½±ãµÄ²Ù×÷Âß¼­¡£

×÷Ϊ±íÏÖÐÎʽ£¬Ã¿¸ö¿Ø¼þ¶¼ÊÇΪÁËʵÏÖijÖÖÓû§²Ù×÷Ëã·¨ºÍÖ±¹ÛÏÔʾijÖÖÊý¾Ý¶øÉú£¬Ò»¸ö¿Ø¼þ¿´ÉÏÈ¥ÊÇʲôÑù×ÓÓÉËüµÄ¡°Ëã·¨ÄÚÈÝ¡±ºÍ¡°Êý¾ÝÄÚÈݾö¶¨¡±£¬Õâ¾ÍÊÇÄÚÈݾö¶¨ÐÎʽ£¬ÕâÀÎÒÃÇÒýÈëÁ½¸ö¸ÅÄ

¿Ø¼þµÄËã·¨ÄÚÈÝ£ºÖµ¿Ø¼þÄÜչʾÄÄЩÊý¾Ý¡¢¾ßÓÐÄÄЩ·½·¨¡¢ÄÜÏàÓ¦ÄÄЩ²Ù×÷¡¢Äܼ¤·¢Ê²Ã´Ê¼þ£¬¼ò¶øÑÔÖ®¾ÍÊǿؼþµÄ¹¦ÄÜ£¬ËüÃÇÊÇÒ»×éÏà¹ØµÄËã·¨Âß¼­¡£

¿Ø¼þµÄÊý¾ÝÄÚÈÝ£º¿Ø¼þ¾ßÌåչʾµÄÊý¾ÝÊÇʲô¡£

ÒÔÍùµÄGUI¿ª·¢¼¼Êõ£¨ASP.NET+Winform£©ÖУ¬¿Ø¼þÄÚ²¿Âß¼­ºÍÊý¾ÝÊǹ̶¨µÄ£¬³ÌÐòÔ±²»Äܸı䣻¶ÔÓڿؼþµÄÍâ¹Û£¬³ÌÐòÔ±ÄÜ×öµÄ¸Ä±äÒ²·Ç³£µÄÓÐÏÞ£¬Ò»°ãÒ²¾ÍÊÇÉèÖÿؼþµÄÊôÐÔ£¬Ïë¸Ä±ä¿Ø¼þµÄÄÚ²¿½á¹¹ÊDz»¿ÉÄܵġ£Èç¹ûÏëÀ©Õ¹Ò»¸ö¿Ø¼þµÄ¹¦ÄÜ»òÕ߸ü¸ÄÆ÷Íâ¹ÛÈÃÆä¸üÊÊÓ¦ÒµÎñÂß¼­£¬ÄÄÅÂÖ»ÊÇÒ»¶¡µãµÄ¸Ä±ä£¬Ò²ÐèÒª´´½¨¿Ø¼þµÄ×ÓÀà»òÕß´´½¨Óû§¿Ø¼þ¡£Ôì³ÉÕâ¸ö¾ÖÃæµÄ¸ù±¾Ô­ÒòÊÇÊý¾ÝºÍËã·¨µÄ¡°ÐÎʽ¡±ºÍ¡°ÄÚÈÝ¡±ñîºÏµÄÌ«½ôÁË¡£

ÔÚWPFÖУ¬Í¨¹ýÒýÈëÄ£°å΢Èí½«Êý¾ÝºÍËã·¨µÄÄÚÈÝÓëÐÎʽ½ÓñîºÏÁË¡£WPFÖеÄTemplate·ÖΪÁ½´óÀࣺ

ControlTemplate£ºÊÇËã·¨ºÍÄÚÈݵıíÏÖÐÎʽ£¬Ò»¸ö¿Ø¼þÔõô×éÖ¯ÆäÄÚ²¿½á¹¹²ÅÄÜÈÃËü¸ü·ûºÏÒµÎñÂß¼­¡¢ÈÃÓû§²Ù×÷ÆðÀ´¸üÊæ·þ¾ÍÊÇÓÉËüÀ´¿ØÖƵġ£Ëü¾ö¶¨Á˿ؼþ¡°³¤³ÉʲôÑù×Ó¡±£¬²¢ÈóÌÐòÔ±Óлú»áÔڿؼþÔ­ÓеÄÄÚ²¿Âß¼­»ù´¡ÉÏÀ©Õ¹×Ô¼ºµÄÂß¼­¡£

DataTemplate£ºÊÇÊý¾ÝÄÚÈݵÄչʾ·½Ê½£¬Ò»ÌõÊý¾ÝÏÔʾ³ÉʲôÑù×Ó£¬ÊǼòµ¥µÄÎı¾»¹ÊÇÖ±¹ÛµÄͼÐξÍÓÉËüÀ´¾ö¶¨ÁË¡£

Template¾ÍÊÇÊý¾ÝµÄÍâÒÂ-----ControlTemplateÊǿؼþµÄÍâÒ£¬DataTemplateÊÇÊý¾ÝµÄÍâÒ¡£

ÏÂÃæÈÃÎÒÃÇÐÀÉÍÁ½¸öÀý×Ó£º

WPFÖпؼþ²»ÔÚ¾ßÓй̶¨µÄÐÎÏ󣬽ö½öÊÇËã·¨ÄÚÈÝ»òÊý¾ÝÄÚÈݵÄÔØÌå¡£Äã¿ÉÒ԰ѿؼþÀí½âΪһ×é²Ù×÷Âß¼­´©ÉÏÁËÒ»Ì×Ò·þ£¬»»Ì×Ò·þ¾Í±ä³ÉÁËÁíÍâÒ»¸öÄ£Ñù¡£Äã¿´µ½µÄ¿Ø¼þĬÈÏÐÎÏóʵ¼ÊÉϾÍÊdzö³§Ê±Î¢ÈíΪËü´©ÉϵÄĬÈÏÒ·þ¡£¿´µ½ÏÂÃæÍ¼ÖеÄζȼƣ¬ÄãÊDz»ÊÇϰ¹ßÐԵIJµ½ÊÇÓÉÈô¸É¿Ø¼þºÍͼÐÎÆ´´ÕÆðÀ´µÄUserControlÄØ£¿Êµ¼ÊÉÏËüÊÇÒ»¸öProgressBar¿Ø¼þ£¬Ö»ÊÇÎÒÃǵÄÉè¼ÆÊ¦ÎªÆäÉè¼ÆÁËÒ»Ì×ÐÂÒ·þ-----ÕâÌ×Ò·þ¸Ä±äÁËÆäһЩÑÕÉ«¡¢Ìí¼ÓÁËһЩװÊÎÆ·ºÍ¿Ì¶ÈÏß²¢Çå³ýÁËÂö²«¶¯»­£¬Ð§¹ûÈçÏÂͼ£º

WPFÖÐÊý¾ÝÏÔʾ³ÉʲôÑù×Ó¿ÉÒÔÓÉ×Ô¼ºÀ´¾ö¶¨¡£±ÈÈçÏÂÃæÕâÕÅͼ£¬Ö»ÊÇΪÊý¾ÝÌõĿ׼±¸ÁËÒ»¸öDataTemplate£¬Õâ¸öDataTemplateÖÐÓÃbinding°ÑÒ»¸öTextBlockµÄTextÊôÐÔÖµ¹ØÁªµ½Êý¾Ý¶ÔÏóµÄYearÊôÐÔÉÏ¡¢°ÑÒ»¸öRectangleµÄWidthÊôÐÔºÍÁíÍâÒ»¸öTextBlockµÄTextÊôÐÔ¹ØÁªµ½Êý¾Ý¶ÔÏóµÄPriceÊôÐÔÉÏ£¬²¢Ê¹ÓÃStackPanelºÍGridΪÕ⼸¸ö¿Ø¼þ²¼¾Ö¡£Ò»µ©Ó¦ÓÃÁËÕâ¸öDataTemplate£¬µ¥µ÷µÄÊý¾Ý¾Í±ä³ÉÁËÖ±¹ÛµÄÖù״ͼ£¬ÈçÏÂͼËùʾ¡£ÒÔÍùÕâÏ×÷²»µ«ÐèÒªÏÈ´´½¨ÓÃÓÚչʾÊý¾ÝµÄUserControl£¬»¹ÒªÎªUserControlÌí¼ÓÏÔʾ/»ØÐ´Êý¾ÝµÄ´úÂë¡£

Èç¹û±ðµÄÏîÄ¿ÖÐÒ²ÐèÒªÓõ½Õâ¸öÖù״ͼ£¬ÄãÒª×öµÄÊÂÇéÖ»Êǽ«Õâ¸öXAML´úÂë·¢¸øËûÃÇ¡£Æä´úÂëÈçÏ£º

<DataTemplate>  
<Grid>
<StackPanel Orientation="Horizontal">
<Grid>
<Rectangle Stroke="Yellow" Fill="Orange" Width="{Binding Price}"></Rectangle>
<TextBlock Text="{Binding Year}"></TextBlock>
</Grid>
<TextBlock Text="{Binding Price}" Margin="5,0"></TextBlock>
</StackPanel>
</Grid>
</DataTemplate>

ÎÒÏ룬¾¡¹ÜÄ㻹ûÓÐѧϰʲôDataTempldate£¬µ«½èÖúÇ°ÃæÑ§Ï°µÄ»ù´¡Ò»Ñù¿ÉÒÔ¿´¸ö°Ë¾Å²»ÀëÊ®ÁË¡£

1.2 Êý¾ÝµÄÍâÒÂDataTemplate

¡°ºá¿´³ÉÁë²à³É·å£¬Ô¶½ü¸ßµÍ¸÷²»Í¬¡±Â®É½µÄÃÀ¾°Èç´Ë£¬Êý¾ÝÓֺγ¢²»ÊÇÕâÑùÄØ£¿Í¬ÑùÒ»ÌõÊý¾Ý£¬±ÈÈç¾ßÓÐID¡¢Name¡¢PhoneNumber¡¢AddressµÈStudentµÄʵÀý£¬·ÅÔÚGridViewÀïÃæÓÐʱ¿ÉÄÜÊǼòµ¥µÄÎı¾¡¢Ã¿¸öµ¥Ôª¸ñÖ»ÏÔʾһ¸öÊôÐÔ£»·ÅÔÚListBoxÀïÃæÓÐʱΪÁ˱ÜÃâµ¥µ÷¿ÉÒÔÔÚ×î×ó¶ËÏÔʾһ¸ö64*64µÄСͼÏñ£¬ÔÙ½«ÆäËüÐÅÏ¢·ÖÁ½ÐÐÏÔʾÔÚÆäºóÃæ£»Èç¹ûµ¥¶ÀÏÔʾһ¸öѧÉúÐÅÏ¢Ôò¿ÉÒÔÓÃÀàËÆ¼òÀúµÄ¸´ÔÓ¸ñʽÀ´Õ¹ÏÖѧÉúµÄÈ«²¿Êý¾Ý¡£Ò»ÑùµÄÄÚÈÝ¿ÉÒÔÓò»Í¬µÄÐÎʽÀ´Õ¹ÏÖ£¬Èí¼þÉè¼Æ³ÆÖ®Îª¡°Êý¾Ý--ÊÓͼ¡±Ä£Ê½¡£ÒÔÍùµÄ¿ª·¢¼¼Êõ£¬ÈçMFC¡¢Winform¡¢Asp.netµÈ£¬ÊÓͼҪ¿¿UserControlÀ´ÊµÏÖ¡£WPF²»µ«Ö§³ÖUserControl»¹Ö§³ÖDataTemplateΪÊý¾ÝÐγÉÊÓͼ¡£²»ÒªÒÔΪDataTempldateÓжàÄÑ£¡´ÓControlÉý¼¶µ½DataTemplateÒ»°ã¾ÍÊǸ´ÖÆ£¬Õ³ÌùÒ»ÏÂÔٸö×Ö·ûµÄʶù¡£

DataTempldate³£Óõĵط½ÓÐÈý´¦£¬·Ö±ðÊÇ£º

ContentControlµÄContentTempldateÊôÐÔ£¬Ï൱ÓÚ¸øContentControlµÄÄÚÈÝ´©Ò·þ¡£

ItemControlµÄItemTemplate£¬Ï൱ÓÚ¸øItemControlµÄÊý¾ÝÌõÄ¿´©Ò·þ¡£

GridViewColumnµÄCellTempldateÊôÐÔ£¬Ï൱ÓÚ¸øGridViewColumnµÄÊý¾ÝÌõÄ¿´©Ò·þ¡£

ÈÃÎÒÃÇÓÃÒ»¸öÀý×Ó¶Ô±ÈUserControlºÍDataTemplateµÄʹÓá£Àý×ÓʵÏÖµÄÐèÇóÊÇÕâÑùµÄ£ºÓÐÒ»ÁÐÆû³µÊý¾Ý£¬ÕâÁÐÊý¾ÝÏÔʾÔÚListBoxÀïÃæ£¬ÒªÇóListBoxµÄÌõÄ¿ÏÔʾÆû³µµÄ³§ÉÌͼ±êºÍ¼òÒª²ÎÊý£¬µ¥»÷ij¸öÌõÄ¿ºóÔÚ´°ÌåµÄÏêϸÄÚÈÝÇøÏÔʾÆû³µµÄͼƬºÍÏêϸ²ÎÊý¡£

ÎÞÂÛÊÇʹÓÃUserControl»¹ÊÇDataTemplate£¬³§É̵ÄLogoºÍÆû³µµÄÕÕÆ¬¶¼ÊÇÒªÓõ½µÄ£¬ËùÒÔÏÈÔÚÏîÄ¿Öн¨Á¢×ÊÔ´¹ÜÀíĿ¼²¢°ÑͼƬÌí¼Ó½øÀ´¡£LogoÎļþÃûÓë³§É̵ÄÃû³ÆÒ»Ö£¬ÕÕÆ¬µÄÃû³ÆÔòÓë³µÃûÒ»Ö¡£×éÖ¯½á¹¹Èçͼ£º

Ê×ÏÈ´´½¨CarÊý¾ÝÀàÐÍ£º

public class Car  
{
public string AutoMark { get; set; }
public string Name { get; set; }
public string Year { get; set; }
public string TopSpeed { get; set; }
}

ΪÁËÔÚListBoxÀïÃæÏÔʾCarÀàÐ͵ÄÊý¾Ý£¬ÎÒÃÇÐèҪ׼±¸Ò»¸öUserControl¡£ÃüÃûΪCarListItemView¡£

Õâ¸öUserControlÓÉÒ»¸öCarÀàÐÍʵÀýÔÚ±³ºóÖ§³Ö£¬µ±ÉèÖÃÕâ¸öʵÀýµÄʱºò£¬½çÃæÔªËØ½«ÊµÀýµÄÊôÐÔÖµÏÔʾÔÚ¸÷¸ö¿Ø¼þÀï¡£CarListItemViewµÄXAML´úÂëÈçÏ£º

<UserControl x:Class="WpfApplication1.CarListViewItem"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid Margin="2">
<StackPanel Orientation="Horizontal">
<Image x:Name="igLogo" Grid.RowSpan="3" Width="64" Height="64"></Image>
<StackPanel Margin="5,10">
<TextBlock x:Name="txtBlockName" FontSize="16" FontWeight="Bold"></TextBlock>
<TextBlock x:Name="txtBlockYear" FontSize="14"></TextBlock>
</StackPanel>
</StackPanel>
</Grid>
</UserControl>

CarlistItemViewÓÃÓÚÖ§³Öǰ̨ÏÔʾÊôÐÔC#´úÂëΪ£º

/// <summary>  
/// CarListViewItem.xaml µÄ½»»¥Âß¼­
/// </summary>
public partial class CarListViewItem : UserControl
{
public CarListViewItem()
{
InitializeComponent();
}

private Car car;

public Car Car
{
get { return car; }
set
{
car = value;
this.txtBlockName.Text = car.Name;
this.txtBlockYear.Text = car.Year;
this.igLogo.Source = new BitmapImage(new Uri(@"Resource/Image/"+car.AutoMark+".png",UriKind.Relative));
}
}
}

ÀàËÆµÄÔ­Àí£¬ÎÒÃÇÐèҪΪCarÀàÐÍ×¼±¸Ò»¸öÏêϸÐÅÏ¢ÊÓͼ¡£UserControlÃû³ÆÎªCarDetailView£¬XAML²¿·Ö´úÂëÈçÏ£º

<UserControl x:Class="WpfApplication1.CarDetailView"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="6">
<StackPanel>
<Image x:Name="imgPhoto" Width="400" Height="250"></Image>
<StackPanel Orientation="Horizontal" Margin="5,0">
<TextBlock Text="Name:" FontSize="20" FontWeight="Bold"></TextBlock>
<TextBlock x:Name="txtBlockName" FontSize="20" Margin="5,0"></TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="5,0">
<TextBlock Text="AutoMark:" FontWeight="Bold"></TextBlock>
<TextBlock x:Name="txtBlockAutoMark" Margin="5,0"></TextBlock>
<TextBlock Text="Year:" FontWeight="Bold">

</TextBlock>
<TextBlock x:Name="txtBlockYear" Margin="5,0">

</TextBlock>
<TextBlock Text="Top Speed:" FontWeight="Bold">

</TextBlock>
<TextBlock x:Name="txtTopSpeed" Margin="5,0">

</TextBlock>
</StackPanel>
</StackPanel>
</Border>
</UserControl>

ºǫ֧́³ÖÊý¾Ý´óͬСÒ죺

/// <summary>  
/// CarDetailView.xaml µÄ½»»¥Âß¼­
/// </summary>
public partial class CarDetailView : UserControl
{
public CarDetailView()
{
InitializeComponent();
}

private Car car;

public Car Car
{
get { return car; }
set
{
car = value;
this.txtBlockName.Text = car.Name;
this.txtBlockAutoMark.Text = car.AutoMark;
this.txtBlockYear.Text = car.Year;
this.txtTopSpeed.Text = car.TopSpeed;
this.imgPhoto.Source = new BitmapImage(new Uri(@"Resource/Image/" + car.Name + ".jpg", UriKind.Relative));
}
}
}

×îºó°ÑËüÃÇ×é×°µ½´°ÌåÉÏ£º

<Window x:Class="WpfApplication1.Window35"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window35" Height="350" Width="623" xmlns:my="clr-namespace:WpfApplication1">
<StackPanel Orientation="Horizontal" Margin="5">
<my:CarDetailView x:Name="carDetailView1" />
<ListBox x:Name="listBoxCars" Width="180" Margin="5,0" SelectionChanged="listBoxCars_SelectionChanged">

</ListBox>
</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>
/// Window35.xaml µÄ½»»¥Âß¼­
/// </summary>
public partial class Window35 : Window
{
public Window35()
{
InitializeComponent();
InitialCarList();
}

private void listBoxCars_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
CarListViewItem viewItem = e.AddedItems[0] as CarListViewItem;
if(viewItem!=null)
{
carDetailView1.Car = viewItem.Car;
}
}

private void InitialCarList()
{
List<Car> infos = new List<Car>() {
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="200", Year="1990"},
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="250", Year="1998"},
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="300", Year="2002"},
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="350", Year="2011"},
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="500", Year="2020"}
};
foreach (Car item in infos)
{
CarListViewItem viewItem = new CarListViewItem();
viewItem.Car = item;
this.listBoxCars.Items.Add(viewItem);
}
}
}

public class Car
{
public string AutoMark { get; set; }
public string Name { get; set; }
public string Year { get; set; }
public string TopSpeed { get; set; }
}
}

ÔËÐв¢µ¥»÷ItemÏÔËÐÐЧ¹ûÈçÏÂͼ£º

ºÜÄÑ˵ÕâÑù×öÊÇ´íµÄ£¬µ«ÊÇWPFÀïÃæÈç´ËʵÏÖÐèÇóÕæµÄÊÇÀË·ÑÁËÊý¾ÝÇý¶¯½çÃæÕâÒ»ÖØÒª¹¦ÄÜ¡£ÎÒÃdz£Ëµ°ÑWPFµ±×÷WinformÀ´ÓÃÖ¸µÄ¾ÍÊÇÕâÖÖʵÏÖ·½·¨¡£ÕâÖÖ×ö·¨¶ÔWPF×î´óµÄÇú½â¾ÍÊÇûÓнèÖúBindingÀ´ÊµÏÖÊý¾ÝÇý¶¯½çÃæ£¬²¢ÇÒÈÏΪListBoxItemÀïÃæ·ÅÖõĿؼþ---ÕâÖÖÇú½âÆÈʹÊý¾ÝÔÚ½çÃæÔªÊý¾Ý¼ä½»»»²¢ÇÒ³ÌÐòÔ±Ö»ÄÜͨ¹ýʼþÇý¶¯·½Ê½À´ÊµÏÖÂß¼­------³ÌÐòÔ±±ØÐë½èÖú´¦ÀíListBoxµÄSelecttionChangedʼþÀ´Íƶ¯DetaIlViewÀ´ÏÔʾÊý¾Ý£¬¶øÊý¾ÝÓÖÊÇÓÉCarListItemView¿Ø¼þת½»¸øCarDetailViewµÄ£¬Ö®¼ä»¹×öÁËÒ»´ÎÀàÐÍת»»¡£ÏÂͼÓÃÓÚ˵Ã÷ʼþÇý¶¯Ä£Ê½ÓëÆÚÍûÖÐÊý¾ÝÇý¶¯½çÃæÄ£Ê½µÄ²»Í¬£º

ÏÔÈ»£¬Ê¼þÇý¶¯ÊǿؼþºÍ¿Ø¼þÖ®¼ä¹µÍ¨»òÕß˵ÊÇÐÎʽºÍÐÎʽ֮¼äµÄ¹µÍ¨£¬Êý¾ÝÇý¶¯ÔòÊÇÊý¾ÝÓë¿Ø¼þÖ®¼äµÄ¹µÍ¨£¬ÊÇÄÚÈݾö¶¨ÐÎʽ¡£Ê¹ÓÃDataTemplate¾Í¿ÉÒÔ·½±ãµÄ°ÑʼþÇý¶¯Ä£Ê½×ª»»ÎªÊý¾ÝÇý¶¯Ä£Ê½¡£

ÄãÊDz»Êǵ£ÐÄÇ°ÃæÐ´µÄ´úÂë»á±»É¾µôÄØ£¿²»»áµÄ£¡ÓÉUserControlÉý¼¶ÎªDataTemplateʱ90%µÄ´úÂëÊÇCopy£¬10%µÄ´úÂë¿ÉÒÔ·½Ïòɾ³ý£¬ÔÙ×öÒ»µãµã¸Ä¶¯¾Í¿ÉÒÔÁË¡£ÈÃÎÒÃÇÀ´ÊÔÊÔ¿´¡£

Ê×ÏȰÑÁ¬¸öUserControlµÄо¼ôÇгöÀ´£¬ÓÃDataTempldate½øÐаü×°£¬Ôٷŵ½Ö÷´°ÌåµÄ×ÊÔ´×ÖµäÀï¡£×îÖØÒªµÄÊÇΪDataTemplateÀïÃæµÄÿһ¸ö¿Ø¼þÉèÖÃBinding£¬¸æË߸÷¸ö¿Ø¼þÓ¦¸Ã¹Ø×¢µÄÊÇÊý¾ÝµÄÄĸöÊôÐÔ¡£ÒòΪʹÓÃBIndingÔڿؼþºÍÊý¾Ý¼ä½¨Á¢¹ØÁª£¬ÃâÈ¥ÁËÔÚC#´úÂëÖзÃÎʽçÃæÔªËØ£¬ËùÒÔXAML´úÂëÖеĴ󲿷Öx£ºName¶¼¿ÉÒÔɾµô¡£´úÂë¿´ÉÏÈ¥Ò²¼ò½éÁ˲»ÉÙ¡£

ÓÐЩÊôÐÔ²»ÄÜÖ±½ÓÄÃÀ´Ó㬱ÈÈçÆû³µ³§É̺ÍÃû³Æ²»ÄÜÖ±½ÓÄÃÀ´×öΪͼƬ·¾¶£¬Õâʱ¾ÍҪʹÓÃConverter¡£ÓÐÁ½ÖÖ°ì·¨¿ÉÒÔÔÚXAML´úÂëÖÐʹÓÃConverter£º

°ÑConverterÒÔ×ÊÔ´×ÖµäµÄÐÎʽ·Å½ø×ÊÔ´×ÖµäÀ±¾ÀýʹÓõķ½·¨£©¡£

ΪConverter×¼±¸Ò»¸ö¾²Ì¬ÊôÐÔ£¬Ðγɵ¥¼þģʽ£¬ÔÚXAML´úÂëÀïÃæÊ¹ÓÃ{x£ºStatic}±ê¼ÇÀ©Õ¹À´·ÃÎÊ¡£

ÎÒÃǵÄÁ½¸öConverter´úÂëÈçÏ£º

//³§ÉÌÃû³Æ×ª»»ÎªLogo·¾¶  
public class AutoMarkToLogoPathConverter:IValueConverter
{
/// <summary>
/// ÕýÏòת
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return new BitmapImage(new Uri(string.Format(@"Resource/Image/{0}.png",(string)value),UriKind.Relative));
}
/// <summary>
/// ÄæÏòתδÓõ½
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

//Æû³µÃû³Æ×ª»»ÎªÕÕÆ¬Â·¾¶  
public class NameToPhotoPathConverter:IValueConverter
{
/// <summary>
/// ÕýÏòת
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return new BitmapImage(new Uri(string.Format(@"Resource/Image/{0}.jpg", (string)value), UriKind.Relative));
}
/// <summary>
/// ÄæÏòתδÓõ½
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

ÓÐÁËÕâÁ½¸öConverterÖ®ºóÎÒÃǾͿÉÒÔÉè¼ÆDataTemplateÁË£¬ÍêÕûµÄXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window36"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1.Model"
Title="Window36" Height="350" Width="623">
<Window.Resources>
<!--Converter-->
<local:AutoMarkToLogoPathConverter x:Key="amp"/>
<local:NameToPhotoPathConverter x:Key="npp"/>
<!--DataTemplate For DatialView-->
<DataTemplate x:Key="DatialViewTemplate">
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="6">
<StackPanel>
<Image x:Name="imgPhoto" Width="400" Height="250" Source="{Binding AutoMark,Converter={StaticResource npp}}"></Image>
<StackPanel Orientation="Horizontal" Margin="5,0">
<TextBlock Text="Name:" FontSize="20" FontWeight="Bold"></TextBlock>
<TextBlock FontSize="20" Margin="5,0" Text="{Binding Name}"></TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="5,0">
<TextBlock Text="AutoMark:" FontWeight="Bold"></TextBlock>
<TextBlock Margin="5,0" Text="{Binding AutoMark}"></TextBlock>
<TextBlock Text="Year:" FontWeight="Bold">

</TextBlock>
<TextBlock Text="{Binding Year}" Margin="5,0">

</TextBlock>
<TextBlock Text="Top Speed:" FontWeight="Bold">

</TextBlock>
<TextBlock Text="{Binding TopSpeed}" Margin="5,0">

</TextBlock>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
<!--Data Template For ItemView-->
<DataTemplate x:Key="ItemView">
<Grid Margin="2">
<StackPanel Orientation="Horizontal">
<Image x:Name="igLogo" Grid.RowSpan="3" Width="64" Height="64" Source="{Binding Name,Converter={StaticResource amp}}"></Image>
<StackPanel Margin="5,10">
<TextBlock Text="{Binding Name}" FontSize="16" FontWeight="Bold"></TextBlock>
<TextBlock Text="{Binding Year}" FontSize="14"></TextBlock>
</StackPanel>
</StackPanel>
</Grid>
</DataTemplate>
</Window.Resources>
<!--´°ÌåÄÚÈÝ-->
<StackPanel Orientation="Horizontal">
<UserControl ContentTemplate="{StaticResource DatialViewTemplate}" Content="{Binding Path=SelectedItem,ElementName=lbInfos}"></UserControl>
<ListBox x:Name="lbInfos" ItemTemplate="{StaticResource ItemView}"></ListBox>
</StackPanel>
</Window>

´úÂë¶ÔÓÚ³õѧÕßÀ´ËµÓе㳤µ«Êǽṹ·Ç³£¼òµ¥¡£ÆäÖÐ×îÖØÒªµÄÓÐÁ½¾ä£º

ContentTemplate="{StaticResource DatialViewTemplate}"£¬Ï൱ÓÚ¸øÒ»¸öÆÕͨµÄUserControl´©ÉÏÁËÒ»¼þÍâÒ¡¢ÈÃCarÊý¾ÝÒÔͼÎIJ¢Ã¯µÄ·½Ê½Õ¹ÏÖ³öÀ´¡£Õâ¼þÍâÒ¾ÍÊÇx:Key="DatialViewTemplate"±ê¼ÇµÄDataTemplate×ÊÔ´¡£

ItemTemplate="{StaticResource ItemView}"£¬°Ñÿһ¼þÊý¾ÝµÄÍâÒ½»¸øListBox£¬µ±ListBoxµÄItemSource±»¸³ÖµµÄʱºò£¬ListBox¾Í»áΪÿ¸öÌõÄ¿´©ÉÏÕâ¼þÍâÒ¡£Õâ¼þÍâÒÂÊÇÒÔx:Key="ItemView"±ê¼ÇµÄDataTemplate×ÊÔ´¡£

ÒòΪ²»ÔÙʹÓÃʼþÇý¶¯£¬¶øÇÒΪÊý¾Ý´©Ò·þµÄÊÂÒ²ÒѾ­×Ô¶¯Íê³É£¬ËùÒÔºǫ́µÄC#´úÂë¾Í·Ç³£µÄ¼òµ¥¡£´°ÌåµÄC#´úÂë¾ÍֻʣÏÂÕâЩ:

/// <summary>  
/// Window36.xaml µÄ½»»¥Âß¼­
/// </summary>
public partial class Window36 : Window
{
public Window36()
{
InitializeComponent();
InitialCarList();
}

private void InitialCarList()
{
List<Car> infos = new List<Car>() {
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="200", Year="1990"},
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="250", Year="1998"},
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="300", Year="2002"},
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="350", Year="2011"},
new Car(){ AutoMark="Aodi", Name="Aodi", TopSpeed="500", Year="2020"}
};
this.lbInfos.ItemsSource = infos;
}
}

ÔËÐгÌÐò£¬Ð§¹ûÈçÏÂͼ£º

Óë֮ǰÓÃUserControlûÓÐÈκÎÇø±ð¡£Óû§ÓÀÔ¶²»ÖªµÀ³ÌÐòÔ±ÔÚºǫ́ʹÓõÄÊÇʲô¼¼ÊõÓëģʽ£¬µ«ÊǶÔÓÚ³ÌÐòÔ±£¬ÎÒÃÇ¿ÉÒÔÇå³þµÄÌå»áµ½Ê¹ÓÃDataTemplate¿ÉÒÔÈóÌÐò½á¹¹¸ü¼ÓÇåÎú¡¢´úÂë¸ü¼Ó¼ò½à¡¢Î¬»¤¸ü·½±ã¡£²»¿äÕŵÄ˵£¬ÊÇDataTemplate°ïÖú³¹µ×Íê³ÉÁË¡°Êý¾ÝÇý¶¯½çÃæ¡±£¬ÈÃBingdingºÍÊý¾ÝÇý¶¯ÉøÍ¸µ½Óû§½çÃæµÄÿһ¸öϸ°ûÖС£

1.3 ¿Ø¼þµÄÍâÒÂControlTemplate

ÿÿÌáµ½ControlTemplateÎÒ¶¼»áÏëµ½¡°Åû×ÅÑòƤµÄÀÇ¡±Õâ¾ä»°-----ÅûÉÏÑòƤ֮ºó£¬ËäÈ»¿´ÉÏÈ¥ÏñÖ»Ñò£¬µ«ÆäÐÐΪÈÔÈ»ÊÇÆ¥ÀÇ¡£ÀǵÄÐÐΪָµÄÊÇËüÄܳԱðµÄ¶¯Îï¡¢¶Ô×ÅÂúÔº¿½ÐµÈÊÂÇ飬¿Ø¼þÒ²ÓÐ×Ô¼ºµÄÐÐΪ£¬±ÈÈçÏÔʾÊý¾Ý¡¢Ö´Ðз½·¨¡¢¼¤·¢Ê¼þµÈ¡£¿Ø¼þµÄÐÐΪҪ¿¿±à³ÌÂß¼­À´ÊµÏÖ£¬ËùÒÔÒ²¿ÉÒ԰ѿؼþµÄÐÐΪ³ÆÎª¿Ø¼þµÄËã·¨ÄÚÈÝ¡£¾Ù¸öÀý×Ó£¬WPFÖеÄCheckBoxÓëÆä»ùÀàToggleButtonµÄ¹¦Äܼ¸ºõÍêȫһÑù£¬µ«Íâ¹Û²î±ðÉÏÈ´·Ç³£µÄ´ó£¬Õâ¾ÍÊǸü»»ControlTemplateµÄ½á¹û¡£¾­¹ý¸ü»»ControlTemplate£¬ÎÒÃDz»µ«¿ÉÒÔÖÆ×÷Åû×ÅCheckBoxÍâÒµÄToggleButton£¬»¹ÄÜÖÆ×÷Åû×ÅζȼÆÍâÒµÄProgressBar¿Ø¼þ¡£

×¢Ò⣺

ʵ¼ÊÏîÄ¿ÖУ¬ControlTemplateÖ÷ÒªÓÐÁ½´óÓÃÎäÖ®µØ£º

ͨ¹ý¸ü»»ControlTemplateÀ´¸ü»»¿Ø¼þµÄÍâ¹Û£¬Ê¹Ö®¾ßÓиüÓŵÄÓû§ÌåÑéºÍÍâ¹Û¡£

½èÖúControlTemplate£¬³ÌÐòÔ±ºÍÉè¼ÆÊ¦¿ÉÒÔ²¢Ðй¤×÷£¬³ÌÐòÔ±¿ÉÒÔʹÓÃWPF±ê×¼¿Ø¼þ½øÐбà³Ì£¬µÈÉè¼ÆÊ¦µÄ¹¤×÷Íê³ÉÖ®ºó£¬Ö»ÐèÒª°ÑеÄControlTemplateÓ¦ÓõijÌÐòÖм´¿É¡£

ÈçºÎΪ¿Ø¼þÉè¼ÆControlTemplateÄØ£¿Ê×ÏÈÐèÒªÄãÁ˽âÿ¸ö¿Ø¼þµÄÄÚ²¿½á¹¹¡£Äã¿ÉÄÜ»áÎÊ£ºÔÚÄĶù¿ÉÒԲ鿴µ½¿Ø¼þµÄÄÚ²¿½á¹¹ÄØ£¿Ã»ÓÐÎĵµ¿É²é£¬ÏëÖªµÀÒ»¸ö¿Ø¼þµÄÄÚ²¿½á¹¹±ØÐë°Ñ¿Ø¼þ¡°´òË顱ÁË¿´Ò»Ï¡£ÓÃÓÚ´òËé¿Ø¼þ¡¢²é¿´¿Ø¼þÄÚ²¿½á¹¹µÄ¹¤¾ß¾ÍÊÇblend£¬Ä¿Ç°×îа汾ÊÇ5.0¡£

1.3.1 âÒ¶¡½âÅ£¿´¿Ø¼þ

ÌôÊÁ×ÓÓ¦¸ÃÕÒÈíµÄÄ󣬯ÊÎö¿Ø¼þÒ²µÃ´Ô¼òµ¥µÄÈëÊÖ¡£TextBoxºÍButton×î¼òµ¥£¬ÎÒÃǾʹÓÕâÁ½¸ö¿Ø¼þÈëÊÖ¡£ÔËÐÐBlend£¬Ð½¨Ò»¸öÏîÄ¿»òÕß´ò¿ªÒ»¸öÒѾ­´æÔÚµÄÏîÄ¿£¬ÏȰѴ°ÌåµÄÑÕÉ«¸ÄΪÏßÐÔ½¥±ä£¬ÔÙÔÚ´°ÌåµÄÖ÷ÇøÓò»­Á½¸öTextBoxºÍÒ»¸öButton¡£¶ÔÓÚ³ÌÐòÔ±À´Ëµ£¬ÍêÈ«¿ÉÒÔ°ÑBlend¿´×öÊÇÒ»¸ö¹¦ÄܸüÇ¿´óµÄ´°ÌåÉè¼ÆÆ÷£¬¶ø¶ÔÓÚÉè¼ÆÊ¦À´Ëµ£¬¿ÉÒÔ°ÑBlendÀí½âΪXAML´úÂëµÄPhotoShop»òÕßFireWorks¡£³ÌÐòÔËÐÐЧ¹ûÈçÏÂͼ£º

ÏÖÔÚµÄTextBox·½·½ÕýÕý£¬ÓÐÀâÓнǣ¬Óë´°ÌåºÍButtonµÄÔ²½Ç·ç¸ñ²»Ì«Ð­µ÷£¬Ôõô½«ËüµÄ±ß¿ò±ä³ÉÔ²½Ç¾ØÐÎÄØ£¿´«Í³µÄ·½·¨¿ÉÄÜÊÇ´´½¨Ò»¸öUserControl²¢ÔÚTextBoxµÄÍâÃæÌ×Ò»¸öBorder£¬È»ºó»¹ÒªÉùÃ÷һЩÊôÐԺͷ½·¨±©Â¶·â×°ÔÚUserControlÀïµÄTextBoxÉÏ¡£ÎÒÃǵİ취ÊÇÔÚTextBoxÉÏÓÒ»÷£¬ÔÚµ¯³öµÄ²Ëµ¥ÏîÀïÃæÑ¡Ôñ±à¼­Ä£°å----±à¼­¸±±¾£¬ÈçÏÂͼËùʾ£º

Ö®ËùÒÔ²»Ñ¡Ôñ´´½¨¿ÕÏîÊÇÒòΪ´´½¨¿ÕÏîÐèÒªÖØÍ·¿ªÊ¼Éè¼ÆÒ»¸ö¿Ø¼þµÄCon't'rolTemplate£¬ÐÂ×öµÄÒ·þÄÄÈç¸ÄÒ·þÀ´µÄ¿ì°¡£¡µ¥»÷²Ëµ¥Ïîºóµ¯³ö×ÊÔ´¶Ô»°¿ò£¬¾¡¹Ü¿ÉÒÔÓÃC#À´´´½¨ControlTemplate£¬µ«ÊǾø´ó¶àÊýÇé¿öÏÂControlTemplateÊÇÓÉXAML´úÂë±àдµÄ²¢·ÅÔÚ×ÊÔ´´ÊµäÀËùÒԲŻᵯ³ö¶Ô»°¿òѯÎÊÄã×ÊÔ´µÄx:KeyÊÇʲô¡¢´òËã°Ñ×ÊÔ´·ÅÔÚÄÄÀï¡£×÷Ϊ×ÊÔ´£¬ControlTemplate¿ÉÒÔ·ÅÔÚÈý¸öµØ·½£ºApplication×ÊÔ´´ÊµäÀij¸ö½çÃæÔªËØµÄ×ÊÔ´´ÊµäÀï¡¢»òÕß·ÅÔÚÍⲿXAMLÎļþÖС£ÎÒÃÇÑ¡Ôñ°ÑËü·ÅÔÚApplicationµÄ×ÊÔ´´ÊµäÀïÒÔ·½±ãtͳһ¹ÜÀí£¬²¢ÃüÃûΪRoundCornerTextBoxStyle£¬ÈçÏÂͼËùʾ£º

µ¥»÷È·¶¨°´Å¥±ã½øÈëÁËÄ£°åµÄ±à¼­×´Ì¬¡£ÔÚ¶ÔÏóºÍʱ¼äÏßÃæ°åÖй۲ìÒѾ­½âÆÊ¿ªµÄTextBox¿Ø¼þ£¬·¢ÏÖËüÊÇÓÉÒ»¸öÃûΪBdµÄListBoxChromeÌ××ÅÒ»¸öÃûΪPART_ContentHostµÄScrollViewer×é³ÉµÄ¡£ÎªÁËÏÔʾ¾ØÐεÄÔ²½Ç±ß¿ò£¬ÎÒÃÇÖ»ÐèÒª°ÑÍâ²ãµÄListBoxChrome»»³ÉBorder£¬É¾µôBorder²»¾ß±¸µÄÊôÐÔÖµ¡¢ÉèÖÃËüµÄÔ²½Ç»¡¶È¼´¿É¡£

¸ü¸ÄºóµÄºËÐÄ´úÂëÈçÏ£º

<Style x:Key="RoundCornerTextBoxStyle" BasedOn="{x:Null}" TargetType="{x:Type TextBox}">  
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="AllowDrop" Value="true"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true" CornerRadius="5">
<ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

Õâ¶Î´úÂëÓÐÒÔϼ¸¸ö¿´µã£º

¿´µãÒ»£º×÷Ϊ×ÊÔ´µÄ²»Êǵ¥´¿µÄControlTemplate¶øÊÇStyle£¬ËµÊDZ༭ControlTemplateµ«ÊÇʵ¼ÊÉÏÊǰÉControlTemplate°üº¬ÔÚStyleÀ²»ÖªµÀ΢Èí»á²»»á¸üÕýÕâ¸öСÂé·³¡£StyleÊÇÊ²Ã´ÄØ£¿¼òµ¥½²¾ÍÊÇÒ»×é<Setter>£¬Ò²¾ÍÊÇÒ»×éÊôÐÔÉè¼ÆÆ÷¡£»ØÏëÒ»ÏÂWinfrom±à³ÌµÄʱºò£¬´°ÌåÉè¼ÆÆ÷²»ÊÇ¿ÉÒÔÉú³ÉÕâÑùµÄ´úÂëÂð£º

// button1  
//
this.button1.Location = new System.Drawing.Point(1100, 199);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "±¨±í";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// printPreviewDialog1
//
this.printPreviewDialog1.AutoScrollMargin = new System.Drawing.Size(0, 0);
this.printPreviewDialog1.AutoScrollMinSize = new System.Drawing.Size(0, 0);
this.printPreviewDialog1.ClientSize = new System.Drawing.Size(400, 300);
this.printPreviewDialog1.Enabled = true;
this.printPreviewDialog1.Icon = ((System.Drawing.Icon)(resources.GetObject("printPreviewDialog1.Icon")));
this.printPreviewDialog1.Name = "printPreviewDialog1";
this.printPreviewDialog1.Visible = false;

ͬÑùµÄÂß¼­Èç¹ûÔÚXAML´úÂëÀï³ö¾Í±ä³ÉÁËÕâÑù£º

<Style x:Key="a">  
<Setter Property="pName1" Value="value"></Setter>
<Setter Property="pName2" Value="value"></Setter>
<Setter Property="pName3">
<Setter.Value>
<!--ObjectValue-->
</Setter.Value>
</Setter>
<Setter Property="pName4">
<Setter.Value>
<!--ObjectValue-->
</Setter.Value>
</Setter>
lt;/Style>

ʹÓÃStyleÊÇ£¬Èç¹ýValueÖµ±È½Ï¼òµ¥£¬ÄÇô¾ÍÖ±½ÓÓÃAttributeÖµ±íʾ£¬Èç¹ûValueÖµ²»ÄÜÓÃÒ»¸ö¼òµ¥µÄ×Ö·û´®À´±íʾÄÇô¾ÍÐèÒªÓÃXAMLµÄÊôÐÔ¶ÔÏóÓï·¨¡£Àý×ÓÖУ¬TextBoxµÄTemplateÊÇÒ»¸öControlTemplate¶ÔÏó£¬Èç´Ë¸´ÔÓµÄÖµÖ»ÄÜʹÓÃÊôÐÔ¶ÔÏóÓï·¨À´ÃèÊö¡£¶ÔÓÚStyle£¬ºóÃæ»áÓÐרÃŵÄÕ½ÚÀ´ÃèÊö¡£

¿´µã¶þ£ºÖ±½Ó½«ListBoxChromeÌæ»»³ÉBorder±êÇ©£¬È¥µôBorder²»¾ß±¸µÄÊôÐÔ²¢Ìí¼ÓCornerRadius=¡°5¡±£»

¿´µãÈý£ºTemplateBinding¡£ControlTemplate×îÖջᱻÓõ½Ò»¸ö¿Ø¼þÉÏ£¬ÎÒÃdzÆÕâ¸ö¿Ø¼þΪģ°åÄ¿±ê¿Ø¼þ»òÕßÄ£°å»¯¿Ø¼þ£¬ControlTemplateÀïÃæµÄ¿Ø¼þ¿ÉÒÔʹÓÃTemplateBinding½«×Ô¼ºµÄij¸öÊôÐÔÖµ¹ØÁªµ½Ä£°å¿Ø¼þµÄij¸öÊôÐÔÖµÉÏ£¬±ØÒªµÄʱºò»¹¿ÉÒÔÌí¼ÓConverter¡£ÀýÈçBackGround=¡°£ûTemplateBinding Background£ý¡±Õâ¾ä£¬Òâ˼ÊÇÈÃBorderµÄBackgroundºÍÄ¿±ê¿Ø¼þ±£³ÖÒ»Ö£¬²úÉúµÄЧ¹û¾ÍÊÇÄãΪģ°åµÄÄ¿±ê¿Ø¼þÉèÖõÄBackgroundÊôÐÔ£¬Border±»BackgroundÒ²»á¸ú×ű䡣»Ø¹ËBindingÒ»½Ú£¬Äã»á·¢ÏÖ£¬TemplateBindingµÄ¹¦ÄܺͣûBinding RelativeSource=£ûRelativeSource TemplatedParent£ý£ýÒ»Ö£»

ºÃÁË£¬°ÑÎÒÃÇÉè¼ÆºÃµÄStyleÓ¦Óõ½Á½¸öTextBoxÉÏ£¬´úÂëÈçÏ£º

<Window  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
x:Class="WPFApplication.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="385" Height="275">
<Window.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF4D91C6" Offset="0"/>
<GradientStop Color="#FFD9DBF1" Offset="1"/>
</LinearGradientBrush>
</Window.Background>

<Grid x:Name="LayoutRoot">
<TextBox HorizontalAlignment="Left" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Margin="57,49,0,0" Width="255.487" Style="{DynamicResource RoundCornerTextBoxStyle}"/>
<TextBox TextWrapping="Wrap" Text="TextBox" Margin="57,106,56.513,109.163" d:LayoutOverrides="Height" Style="{DynamicResource RoundCornerTextBoxStyle}"/>
<Button Content="Button" VerticalAlignment="Bottom" Margin="149,0,145,42.163"/>
</Grid>
</Window>

³ÌÐòÔËÐÐЧ¹ûÈçÏÂͼ£º

ÒÔͬÑùµÄ·½·¨´òËéButton£¬Äã»á·¢ÏÖButtonµÄÄÚ²¿½á¹¹ºÍTextBox²î²»¶à¡£µ«ÊÇÈç¹û´òËéÒ»¸öProgressBar£¬Äã»á·¢ÏÖËüµÄÄÚ²¿½á¹¹¾Í¸´ÔÓ¶àÁË£¬ÈçÏÂͼ£º

ÔÚBlendÀïÃæÄã¿ÉÒÔͨ¹ý¿ØÖƿؼþºóÃæµÄÑÛ¾¦À´¿ØÖƿؼþµÄÏÔʾÓëÒþ²Ø£¬ÕâÑù¾Í¿ÉÒÔÇø·Öÿ¸ö×ӿؼþµÄÓô¦£¬ÕâÒ²ÊÇѧϰ¿Ø¼þµÄ×îºÃ·½·¨¡£Èç¹ûÏë°ÑÕâ¸öProgressBar¸Ä±ä³ÉÒ»¸öζȼƣ¬Ö»ÐèÒªÔÙ´Ë»ù´¡ÉÏÌí¼ÓÒ»¸ö±³¾°¡¢¸ü¸Ä¿Ø¼þָʾÆ÷µÄǰ¾°É«¡¢ÔÙÔÚºÏÊʵĿؼþÍâÃæÌ×Ò»¸ö»­³ö¿Ì¶ÈGrid£¨¿Ì¶È¿ÉÒÔ¸ù¾ÝÒªÇó¼ÆËã³öÀ´Ò²¿ÉÒÔÊǹ̶¨µÄ£©¡£

²»ÖªµÀ´ó¼ÒÒâʶµ½ÁËûÓУ¬Æäʵÿһ¸ö¿Ø¼þ±¾Éí¾ÍÊÇÒ»¿ÅUIÔªËØÊ÷¡£WPFÖеÄUIÔªËØÊ÷¿ÉÒÔ¿´×öÊÇÁ½¸öÊ÷-----LogicTreeºÍVisualTree£¬ÕâÁ½¿ÃÊ÷µÄ½»µã¾ÍÊÇControlTemplate¡£Èç¹û°Ñ½çÃæÉϵĿؼþÔªËØ¿´×÷Ò»¸ö½Úµã£¬ÄÇÔªËØ¹¹³ÉµÄ¾ÍÊÇLogicTree£¬Èç¹û°Ñ¿Ø¼þÄÚ²¿ÓÉControTemplateÉú³ÉµÄ¿Ø¼þÒ²ËãÉÏ£¬ÄǾ͹¹³ÉÁËVisualTree¡£»»¾ä»°Ëµ£¬LogicTreeÉϵ¼º½²»»á½øÈë¿Ø¼þÄÚ²¿£¬¶øÔÚVisualTreeÉϵ¼º½Ôò¿ÉÒÔ¼ìË÷µ½¿Ø¼þÄÚ²¿ÓÉControlTemplateÉú³ÉµÄ×Ó¼¶¿Ø¼þ¡£

1.3.2 ItemsControlµÄPanelTemplate

ItemsControl¾ßÓÐÒ»¸öÃûΪItemsPanelµÄÊôÐÔ£¬ËüµÄÊý¾ÝÀàÐÍÊÇItemsPanelTemplate¡£ItemsPanelTemplateÒ²ÊÇÒ»ÖֿؼþTemplate£¬ËüµÄ×öÓÃÊÇ¿ÉÒÔÈóÌÐòÔ±¿ÉÒÔ¿ØÖÆItemControlµÄÌõÄ¿ÈÝÆ÷¡£

¾ÙÀý¶øÑÔ£¬ÔÚÎÒÃǵÄÓ¡ÏóÖÐListBoxÖеÄÌõÄ¿¶¼ÊÇÖÁÉ϶øÏÂÅÅÁеģ¬Èç¹û¿Í»§ÒªÇóÎÒÃÇ×öÒ»¸öˮƽÅÅÁеÄListBoxÔõô°ìÄØ£¿WPF֮ǰ£¬ÎÒÃÇÖ»ÄÜÖØÐ´¿Ø¼þ±È½Ïµ×²ãµÄ·½·¨ºÍÊôÐÔ£¬¶øÏÖÔÚÎÒÃÇÖ»ÐèÒªµ÷ÕûListBoxµÄItemPanelÊôÐÔ¡£Çë¿´ÏÂÃæµÄ´úÂë¡£

ÕâÊÇÒ»¸öûÓо­¹ýµ÷ÕûµÄListBox£¬ÌõÄ¿×ÝÏòÅÅÁÐ

<Grid x:Name="LayoutRoot" Margin="5">  
<ListBox>
<TextBlock>Darren</TextBlock>
<TextBlock>Andy</TextBlock>
<TextBlock>Jacky</TextBlock>
<TextBlock>T-Soft</TextBlock>
</ListBox>
</Grid>

Èç¹ûÎÒÃǰѴúÂë¸Ä³ÉÕâÑù£º

<Grid x:Name="LayoutRoot" Margin="5">  
<ListBox>
<!--ItemsPanel-->
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<!--ÌõÄ¿-->
<TextBlock>Darren</TextBlock>
<TextBlock>Andy</TextBlock>
<TextBlock>Jacky</TextBlock>
<TextBlock>T-Soft</TextBlock>
</ListBox>
</Grid>

ÌõÄ¿¾Í»á°ü×°ÔÚÒ»¸öˮƽÅÅÁеÄStackPanelÖУ¬´Ó¶øºáÏòÅÅÁУ¬ÈçÏÂͼËùʾ£º

1.4 DataTemplateºÍControlTemplateµÄ¹ØÏµºÍÓ¦ÓÃ

1.4.1 DataTemplateºÍControlTemplateµÄ¹ØÏµ

ѧϰ¹ýDataTemplateºÍControlTemplate£¬ÄãÓ¦¸ÃÒѾ­Ìå»áµ½£¬¿Ø¼þÖ»ÊÇÊý¾ÝµÄÐÐΪºÍÔØÌ壬ÊǸö³éÏóµÄ¸ÅÄÖÁÓÚËü±¾Éí³¤³ÉʲôÑù×Ó£¨¿Ø¼þÄÚ²¿½á¹¹£©£¬ËüµÄÊý¾Ý»á³¤³ÉʲôÑù×Ó£¨Êý¾ÝÏÔʾ½á¹¹£©¶¼ÊÇ¿¿TemplateÉú³ÉµÄ¡£¾ö¶¨¿Ø¼þÍâ¹ÛµÄControlTemplate£¬¾ö¶¨Êý¾ÝÍâ¹ÛµÄDataTemplate£¬ËüÃÇÕýʽControÀàµÄTemplateºÍContentTemplateÁ½¸öÊôÐÔÖµ¡£ËüÃǵÄ×÷Ó÷¶Î§ÈçÏÂͼ£º

·²ÊÇTemplate£¬×îÖÕ¶¼Òª×÷ÓÃÔڿؼþÉÏ£¬Õâ¸ö¿Ø¼þ¾ÍÊÇTemplateµÄÄ¿±ê¿Ø¼þ£¬Ò²½ÐÄ£°å»¯¿Ø¼þ¡£Äã¿ÉÄÜ»áÎÊ:DataTemplateµÄÄ¿±êÓ¦¸ÃÊÇÊý¾Ýѽ£¬Ôõô»áÊǿؼþÄØ¡£DataTemplate¸øÈ˵ĸоõµÄÈ·ÊÇÊ©¼ÓÔÚÊý¾Ý¶ÔÏóÉÏ£¬µ«Ê©¼ÓÔÚÊý¾Ý¶ÔÏóÉÏÉú³ÉµÄÒ»×é¿Ø¼þ×ܵÃÓиöÔØÌå°É£¿Õâ¸öÔØÌåÒ»°ãÂäʵÔÚÒ»¸ö½Ð×öContentPresenter¶ÔÏóÉÏ¡£ContentPresenterÀàÖ»ÓÐContentTemplateÊôÐÔ¡¢Ã»ÓÐTemplateÊôÐÔ£¬Õâ¾ÍÖ¤Ã÷Á˳ÐÔØÓÉDataTemplateÉú³ÉµÄÒ»×é¿Ø¼þÊÇËûµÄרÃÅÓÃ;¡£

ÖÁ´ËÎÒÃÇ¿ÉÒÔ¿´³ö£¬ÓÉControlTemplateÉú³ÉµÄ¿Ø¼þÊ÷ÆäÊ÷¸ù¾ÍÊÇControleTemplateµÄÄ¿±ê¿Ø¼þ£¬´ËÄ£°å»¯¿Ø¼þµÄTemplateÊôÐÔÖµ¾ÍÊÇÒ»¸öControlTemplateʵÀý¡£ÓëÖ®Ïà·Â£¬ÓÉDataTemplateÉú³ÉµÄ¿Ø¼þÊ÷Æä¸ùÊÇÒ»¸öContentPresenter¿Ø¼þ£¬´ËÄ£°å»¯¿Ø¼þµÄContentTemplateÊôÐÔÖµ¾ÍÊÇÕâ¸öDataTemplateʵÀý¡£ÒòΪContentPresenter¿Ø¼þÊÇControlTemplate¿Ø¼þÊ÷ÉϵÄÒ»¸ö½Úµã£¬ËùÒÔDataTemplate¿Ø¼þÊ÷ÊÇControlTemplateÀïÃæµÄÒ»¸ö×ÓÊ÷¡£ËüÃǵĹØÏµÈçÏÂͼ£º

¼ÈÈ»TemplateÉú³ÉµÄ¿Ø¼þÊ÷¶¼Óиù£¬ÄÇôÈçºÎÈ¥ÕÒµ½¸ùÄØ£¿°ì·¨ºÜ¼òµ¥£¬Ã¿¸ö¿Ø¼þ¶¼ÓиöÃûΪTemplateParentÊôÐÔ£¬Èç¹ûËüµÄÖµ²»Îªnull£¬ËµÃ÷Õâ¸ö¿Ø¼þÊÇÓÉTemplate×Ô¶¯Éú³ÉµÄ£¬¶øÊôÐÔÖµ¾ÍÊÇÓ¦ÓÃÁËÄ£°åµÄ¿Ø¼þ¡£Èç¹ûÓÉTemplateÉú³ÉµÄ¿Ø¼þʹÓÃÁËTemplateBinding»ñÈ¡ÊôÐÔÖµ£¬ÔòTemplateBindingµÄÊý¾ÝÔ´¾ÍÊÇÓ¦ÓÃÕâ¸öÄ£°åµÄÄ¿±ê¿Ø¼þ¡£

»Ø¹Ëһϱ¾Õ¿ªÍ·µÄDataTemplateÔ´Â룺

<DataTemplate>  
<Grid>
<StackPanel Orientation="Horizontal">
<Grid>
<Rectangle Stroke="Yellow" Fill="Orange" Width="{Binding Price}"></Rectangle>
<TextBlock Text="{Binding Year}"></TextBlock>
</Grid>
<TextBlock Text="{Binding Price}" Margin="5,0"></TextBlock>
</StackPanel>
</Grid>
</DataTemplate>

ÕâÀïÓÃµÄÆÕͨµÄBinding¶ø²»ÊÇTemplateBinding£¬ÄÇÊý¾ÝÔ´ÓÖÊÇË­ÄØ£¿²»ÖªµÀ´ó¼ÒÊÇ·ñ»¹¼ÇµÃ£¬µ±ÎªÒ»¸öBindingÖ»Ö¸¶¨Path¶ø²»Ö¸¶¨SourceµÄʱºò£¬Binding»áÑØÂß¼­Ê÷Ò»Ö±ÏòÉÏÕÒ¡¢²é¿´Ã»Ò»¸ö½ÚµãµÄDataContextÊôÐÔ£¬Èç¹ûDataContextÒýÓõĶÔÏó¾ßÓÐPathÖ¸¶¨µÄÊôÐÔÃû£¬Binding¾Í»á°ÑÕâ¸ö¶ÔÏóµ±×÷×Ô¼ºµÄÊý¾ÝÔ´¡£ÏÔÈ»£¬Èç¹û°ÑÊý¾Ý¶ÔÏó¸³Öµ¸øContentPresenterµÄDataContextÊôÐÔ£¬ÓÉDataTeplateÉú³ÉµÄ¿Ø¼þ×ÔÈ»»áÕÒµ½Õâ¸öÊý¾Ý¶ÔÏó²¢°ÑËüµ±×÷×Ô¼ºµÄÊý¾ÝÔ´¡£

1.4.2 DataTemplateºÍControlµÄÓ¦ÓÃ

ΪTemplateÉèÖÃÆäÓ¦ÓÃÄ¿±êÓÐÁ½ÖÖ·½·¨£¬Ò»¸öÊÇÖð¸öÉèÖÿؼþµÄTemplate/ContentTemplate/ItemTemlate/CellTemplateµÈÊôÐÔ£¬²»ÏëÓ¦ÓÃTemplateµÄ¿Ø¼þ²»ÉèÖã»ÁíÒ»ÖÖÊÇÕûÌåÓ¦Ó㬼´°ÑTemplateÓ¦Óõ½Ä³¸öÀàÐ͵Ŀؼþ»òÕßÊý¾ÝÉÏ¡£

°ÑControlTemplateÓ¦Óõ½ËùÓпؼþÉÏÐèÒª½èÖúStyleÀ´ÊµÏÖ£¬µ«Style²»Äܱê¼ÇX:KEY£¬ÀýÈçÏÂÃæµÄ´úÂ룺

<Style  BasedOn="{x:Null}" TargetType="{x:Type TextBox}">  
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="AllowDrop" Value="true"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true" CornerRadius="5">
<ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
lt;/Style>

StyleûÓÐX£ºkey±ê¼Ç£¬Ä¬ÈÏΪÒýÓõ½ËùÓеÄx:typeÖ¸¶¨µÄ¿Ø¼þÉÏ£¬Èç¹û²»ÏëÓ¦ÓÃÔò½«style±ê¼ÇΪ{x:null}¡£ÔËÐÐЧ¹ûÈçÏÂͼ£º

°ÑDataTemplateÓ¦Óõ½Ä³¸öÊý¾ÝÀàÐÍÉÏÊÇÉèÖÃDataTemplateµÄDataTypeÊôÐÔ£¬²¢ÇÒDataTemplate×÷Ϊ×ÊԴʱҲ²»ÄÜ´øx:key±ê¼Ç£¬ ÀýÈçÏÂÃæµÄ´úÂ룺

<Window  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFApplication"
xmlns:c="clr-namespace:System.Collections;assembly=mscorlib"
x:Class="WPFApplication.Window3"
x:Name="Window"
Title="Window3"
Width="288" Height="181">
<Window.Resources>
<!--DataTemplate-->
<DataTemplate DataType="{x:Type local:Unit}">
<Grid>
<StackPanel Orientation="Horizontal">
<Grid>
<Rectangle Stroke="Yellow" Fill="Orange" Width="{Binding Price}"></Rectangle>
<TextBlock Text="{Binding Year}"></TextBlock>
</Grid>
<TextBlock Text="{Binding Year}" Margin="5,0"></TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
<!--Êý¾ÝÔ´-->
<c:ArrayList x:Key="ds">
<local:Unit Year="2001Äê" Price="100"></local:Unit>
<local:Unit Year="2002Äê" Price="120"></local:Unit>
<local:Unit Year="2003Äê" Price="140"></local:Unit>
<local:Unit Year="2004Äê" Price="160"></local:Unit>
<local:Unit Year="2005Äê" Price="180"></local:Unit>
<local:Unit Year="2006Äê" Price="200"></local:Unit>
</c:ArrayList>

</Window.Resources>

<StackPanel>
<ListBox ItemsSource="{StaticResource ds}"></ListBox>
<ComboBox ItemsSource="{StaticResource ds}" Margin="5"></ComboBox>
</StackPanel>
</Window>

´úÂëÖеÄDataTemplateµÄÄ¿±êÊý¾ÝÀàÐͺÍListBoxµÄÌõÄ¿ÀàÐͶ¼ÊÇUnit:

public class Unit  
{
public string Year{get;set;}
public int Price{get;set;}
}

´ËʱDataTemplate»á×Ô¶¯¼ÓÔØµ½ËùÓеÄUnitÀàÐͶÔÏóÉÏ£¬¾¡¹ÜÎÒûÓÐΪListBoxºÍCompBoxÖ¸¶¨ItemTemplate£¬Ò»Ñù»áµÃµ½ÏÂͼµÄЧ¹û£º

ºÜ¶àʱºòÊý¾ÝÊÇÒÔXMLÐÎʽ´æÈ¡µÄ£¬Èç¹û°ÑXML½ÚµãÏÈת»»ÎªCLRÊý¾ÝÀàÐÍÔÙÓ¦ÓÃDataTemplate¾ÍÂé·³ÁË¡£DataTemplateºÜÖÇÄÜ£¬¾ßÓÐÖ±½Ó°ÑXMLÊý¾Ý½Úµãµ±×÷Ä¿±ê¶ÔÏóµÄ¹¦ÄÜ-----XMLÊý¾ÝÖеÄÔªËØÃû£¨±êÇ©Ãû£©¿ÉÒÔ×÷ΪDataType£¬ÔªËصÄ×Ó½ÚµãºÍAttribute¿ÉÒÔʹÓÃXPathÀ´·ÃÎÊ¡£ÏÂÃæµÄ´úÂëʹÓÃXmlDataProvider×÷ΪÊý¾ÝÔ´£¨ÆäXPathÖ¸³öµÄ±ØÐëÊÇÒ»×é½Úµã£©£¬Çë×¢Òâϸ½ÚÖ®´¦µÄ±ä»¯£º

<Window  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WPFApplication.Window4"
x:Name="Window"
Title="Window4"
Width="314" Height="210">
<Window.Resources>
<!--DataTemplate-->
<DataTemplate DataType="Unit">
<Grid>
<StackPanel Orientation="Horizontal">
<Grid>
<Rectangle Stroke="Yellow" Fill="Orange" Width="{Binding XPath=@Price}"></Rectangle>
<TextBlock Text="{Binding XPath=@Year}"></TextBlock>
</Grid>
<TextBlock Text="{Binding XPath=@Year}" Margin="5,0"></TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
<!--Êý¾ÝÔ´-->
<XmlDataProvider x:Key="ds" XPath="Units/Unit">
<x:XData>
<Units xmlns="">
<Unit Price="100" Year="2001"></Unit>
<Unit Price="120" Year="2002"></Unit>
<Unit Price="140" Year="2003"></Unit>
<Unit Price="160" Year="2004"></Unit>
<Unit Price="180" Year="2005"></Unit>
<Unit Price="200" Year="2006"></Unit>
</Units>
</x:XData>
</XmlDataProvider>

</Window.Resources>

<StackPanel>
<ListBox ItemsSource="{Binding Source={StaticResource ds}}"></ListBox>
<ComboBox ItemsSource="{Binding Source={StaticResource ds}}" Margin="5"></ComboBox>
</StackPanel>
</Window>

XMLµÄÓÅÊÆ¾ÍÊÇ¿ÉÒÔ·½±ãµÄ±íʾ´øÓв㼶µÄÊý¾Ý£¬±ÈÈ磺Äê¼¶----°à¼¶----С×é »ò Ö÷²Ëµ¥---´Î²Ëµ¥----Èý¼¶²Ëµ¥¡£Í¬Ê±WPF×¼±¸ÁËTreeViewºÍMenuItem¿Ø¼þÀ´ÏÔʾ²ã¼¶Êý¾Ý¡£Äܹ»°ïÖú²ã¼¶¿Ø¼þÏÔʾ²ã¼¶Êý¾ÝµÄÄ£°åÊÇHierachicalDataTemplate¡£ÏÂÃæÁ½¸öʵ¼Ê¹¤×÷Öг£¼ûµÄÀý×Ó£º

<?xml version="1.0" encoding="utf-8" ?>  
<Data xmlns="">
<Grade Name="Ò»Äê¼¶">
<Class Name="¼×°à">
<Group Name="A×é">
</Group>
<Group Name="B×é">
</Group>
<Group Name="C×é">
</Group>
</Class>
<Class Name="ÒÒ°à">
<Group Name="A×é">
</Group>
<Group Name="B×é">
</Group>
<Group Name="C×é">
</Group>
</Class>
</Grade>
<Grade Name="¶þÄê¼¶">
<Class Name="¼×°à">
<Group Name="A×é">
</Group>
<Group Name="B×é">
</Group>
<Group Name="C×é">
</Group>
</Class>
<Class Name="ÒÒ°à">
<Group Name="A×é">
</Group>
<Group Name="B×é">
</Group>
<Group Name="C×é">
</Group>
</Class>
</Grade>
</Data>

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

<Window x:Class="WPFApplication.Window6"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window6" Height="268" Width="362">
<Window.Resources>
<!--Êý¾ÝÔ´-->
<XmlDataProvider x:Key="ds" Source="XMLStudent.xml" XPath="Data/Grade"></XmlDataProvider>
<!--Äê¼¶Ä£°å-->
<HierarchicalDataTemplate DataType="Grade" ItemsSource="{Binding XPath=Class}">
<TextBlock Text="{Binding XPath=@Name}"></TextBlock>
</HierarchicalDataTemplate>
<!--°à¼¶Ä£°å-->
<HierarchicalDataTemplate DataType="Class" ItemsSource="{Binding XPath=Group}">
<RadioButton Content="{Binding XPath=@Name}" GroupName="gn"></RadioButton>
</HierarchicalDataTemplate>
<!--С×éÄ£°å-->
<HierarchicalDataTemplate DataType="Group" ItemsSource="{Binding XPath=Student}">
<CheckBox Content="{Binding XPath=@Name}"></CheckBox>
</HierarchicalDataTemplate>
</Window.Resources>


<Grid>
<TreeView Margin="5" ItemsSource="{Binding Source={StaticResource ds}}">

</TreeView>
</Grid>
</Window>

³ÌÐòÔËÐÐЧ¹ûÈçÏÂͼ£º

µÚ¶þ¸öÀý×ÓÊÇͬһÖÖÊý¾ÝÀàÐ͵ÄǶÌ׽ṹ£¬ÕâÖÖÇé¿öÏÂÖ»Éè¼ÆÒ»¸öHierarchicalDataTemplate¾Í¿ÉÒÔÁË£¬Ëü»á²úÉú×Ô¶¯µü´úÓ¦ÓÃЧ¹û¡£
Êý¾ÝÒÀÈ»´æ·ÅÔÚXMLÎļþÖС£Êý¾ÝÈ«²¿ÊÇOPeration'ÀàÐÍ£º

<?xml version="1.0" encoding="utf-8" ?>  
<Data xmlns="">
<Operation Name="Îļþ" Gesture="F">
<Operation Name="н¨" Gesture="N">
<Operation Name="ÏîÄ¿" Gesture="Ctr+P"/>
<Operation Name="ÍøÕ¾" Gesture="Ctr+W"/>
<Operation Name="Îĵµ" Gesture="Ctr+D"/>
</Operation>
<Operation Name="±£´æ" Gesture="S"/>
<Operation Name="´òÓ¡" Gesture="P"/>
<Operation Name="Í˳ö" Gesture="X"/>
</Operation>
<Operation Name="±à¼­" Gesture="E">
<Operation Name="¼ôÇÐ" Gesture="Ctr+X"/>
<Operation Name="¸´ÖÆ" Gesture="Ctr+C"/>
<Operation Name="Õ³Ìù" Gesture="Ctr+V"/>
</Operation>
</Data>

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

<Window x:Class="WPFApplication.Window7"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window7" Height="300" Width="300">
<Window.Resources>
<!--Êý¾ÝÔ´-->
<XmlDataProvider x:Key="ds" Source="MenuXML.xml" XPath="Data/Operation"></XmlDataProvider>
<!--OperationÄ£°å-->
<HierarchicalDataTemplate DataType="Operation" ItemsSource="{Binding XPath=Operation}" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding XPath=@Name}" Margin="10,0"></TextBlock>
<TextBlock Text="{Binding XPath=@Gesture}"></TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
</Window.Resources>
<StackPanel>
<Menu ItemsSource="{Binding Source={StaticResource ds}}"></Menu>
</StackPanel>
</Window>

ÔËÐÐЧ¹ûÈçÏÂͼ£º

ÖµµÃÒ»ÌáµÄÊÇ£¬HierarchicalDataTemplateµÄ×÷Óò»ÊÇMenuItemµÄÄÚÈݶøÊÇËüµÄHeader¡£Èç¹û¶ÔMenuItemµÄµ¥»÷ʼþ½øÐÐÕìÌý´¦Àí£¬ÎÒÃǾͿÉÒÔ´Ó±»µ¥»÷µÄMenuItemµÄHeaderÖÐÈ¡³öXMLÊý¾Ý¡£
XAML´úÂëÈçÏ£º

<StackPanel MenuItem.Click="StackPanel_Click">  
<Menu ItemsSource="{Binding Source={StaticResource ds}}"></Menu>
</StackPanel>

ʼþ´¦Àí´úÂëÈçÏ£º

private void StackPanel_Click(object sender, RoutedEventArgs e)  
{
MenuItem item = e.OriginalSource as MenuItem;
XmlElement xe = item.Header as XmlElement;
MessageBox.Show(xe.Attributes["Name"].Value);
}

Ò»µ©Äõ½ÁËÊý¾Ý£¬Ê¹ÓÃÊý¾ÝÈ¥Çý¶¯Ê²Ã´ÑùµÄÂß¼­ÍêÈ«ÓÉÄãÀ´¾ö¶¨ÁË¡£±ÈÈç¿ÉÒÔά»¤Ò»¸öCommandHelperÀ࣬¸ù¾ÝÄõ½µÄÊý¾ÝÀ´¾ö¶¨Ö´ÐÐʲôRoutedCommand¡£

1.4.3 ѰÕÒʧÂäµÄ¿Ø¼þ

¡°¾®Ë®²»·¸ºÓË®¡±³£ÓÃÀ´ÐÎÈÝÁ½¸ö×éÖ¯Ö®¼ä½çÏÞ·ÖÃ÷¡¢»¥²»Ïà¸É£¬LogicTreeÓë¿Ø¼þÄÚ²¿Õâ¿ÅСÊ÷Ö®¼ä¾Í±£³Ö×ÅÕâÖÖ¹ØÏµ¡£»»¾ä»°Ëµ£¬Èç¹ûUIÔªËØÊ÷ÉÏÓиöX£ºName=¡°TextBox1¡±µÄ¿Ø¼þ£¬Ä³¸ö¿Ø¼þÄÚ²¿Ò²ÊÇÓÉTemplateÉú³ÉµÄx:Name="TextBox1"µÄ¿Ø¼þ£¬ËüÃDz¢²»³åÍ»£¬LogicTree²»»á¿´µ½¿Ø¼þÄÚ²¿µÄϸ½Ú£¬¿Ø¼þÄÚ²¿ÔªËØÒ²²»»áÈ¥Àí»á¿Ø¼þÍâÃæÊÇʲôֵ¡£Äã¿ÉÄÜ»áÏ룺¡°ÕâÑùÒ»À´£¬ÍòÒ»ÎÒÏë´Ó¿Ø¼þÍⲿ·ÃÎÊÄÚ²¿µÄ¿Ø¼þ£¬»ñÈ¡ËüµÄÊôÐÔÖµ£¬Æñ²»ÊÇ×ö²»µ½ÁË¡£¡±·ÅÐÄ£¬WPFΪÎÒÃÇ×¼±¸ÁË·ÃÎʿؼþÄÚ²¿Ð¡ÊÀ½çµÄÈë¿Ú£¬ÏÖÔÚÎÒÃǾͿªÊ¼³ö·¢Ñ°ÕÒÄÇЩʧÂäµÄ¿Ø¼þ¡£

ÓÉControlTemplateºÍDataTemplateÉú³ÉµÄ¿Ø¼þ¶¼ÊÇ¡°ÓÉTemplateÉú³ÉµÄ¿Ø¼þ¡±¡£ControlTemplateºÍDataTemplateÁ½¸öÀà¾ùÅÉÉú×ÔFrameWorkTemplateÀ࣬Õâ¸öÀàÓиöÃûΪFindNameµÄ·½·¨¹©ÎÒÃǼìË÷ÆäÄÚ²¿¿Ø¼þ¡£Ò²¾ÍÊÇ˵£¬Ö»ÒªÎÒÃÇÄÜÄõ½Template£¬ÕÒµ½ÆäÄÚ²¿¿Ø¼þ¾Í²»³ÉÎÊÌâ¡£¶ÔÓÚControlTemplate¶ÔÏ󣬷ÃÎÊÆäÄ¿±ê¿Ø¼þµÄDatatemplateÊôÐԾͿÉÒÔÄõ½£¬µ«ÏëÄõ½DataTemplate¾ÍÒª·ÑÒ»·¬ÖÜÕÛÁË¡£Ç§Íò²»ÒªÒÔΪListBoxItem»òÕßCompBoxItemÈÝÆ÷¾ÍÊÇDataTemplateµÄÄ¿±ê¿Ø¼þŶ£¡ÒòΪ¿Ø¼þµÄTemplateºÍContentTemplateÍêÈ«ÊÇÁ½ÂëÊ¡£

ÎÒÃÇÏÈÀ´Ñ°ÕÒÓÉControlTemplateÉú³ÉµÄ¿Ø¼þ¡£Ê×ÏÈÉè¼ÆÒ»¸öControlTemplate²¢°ÑËüÓ¦ÓÃÔÚÒ»¸öUserControl¿Ø¼þÉÏ¡£½çÃæÉÏ»¹ÓÐÒ»¸öButton£¬ÔÚËüµÄClickʼþ´¦ÀíÆ÷ÖÐÎÒÃǼìË÷ControlTemplateÉú³ÉµÄ´úÂë¡£

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

<Window x:Class="WPFApplication.Window8"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window8" Height="300" Width="300">
<Window.Resources>
<ControlTemplate x:Key="xtTemp">
<StackPanel Background="Orange">
<TextBox Margin="6" x:Name="textbox1"></TextBox>
<TextBox Margin="6,0" x:Name="textbox2"></TextBox>
<TextBox Margin="6" x:Name="textbox3"></TextBox>
</StackPanel>
</ControlTemplate>
</Window.Resources>
<StackPanel Background="Yellow">
<UserControl x:Name="uc" Template="{StaticResource xtTemp}" Margin="5"></UserControl>
<Button Content="Find By Name" Width="120" Height="30" Click="Button_Click"></Button>
</StackPanel>
</Window>

ButtonµÄʼþ´¦ÀíÆ÷´úÂëÈçÏ£º

private void Button_Click(object sender, RoutedEventArgs e)  
{
TextBox tb = this.uc.Template.FindName("textbox1", this.uc) as TextBox;
tb.Text = "Hello WPF";
StackPanel sp = tb.Parent as StackPanel;
(sp.Children[1] as TextBox).Text = "Hello ControlTemplate";
(sp.Children[2] as TextBox).Text = "I Can Find YOU.";
}

ÔËÐÐЧ¹ûÈçÏ£º

½ÓÏÂÀ´ÎÒÃÇÀ´Ñ°ÕÒÓÉDataTemplateÉú³ÉµÄ¿Ø¼þ¡£²»¹ýÔÚÕýʽѰÕÒ֮ǰ£¬ÎÒÃÇÏÈ˼¿¼Ò»¸öÎÊÌ⣺ѰÕÒµ½Ò»¸öÓÉDataTemplateÉú³ÉµÄ¿Ø¼þÖ®ºó£¬ÎÒÃÇÏë´ÓÖлñÈ¡ÄÄЩÊý¾Ý£¬Èç¹ûÏëµ¥´¿»ñÈ¡ÓëÓû§½çÃæÏà¹ØµÄÊý¾Ý£¨±ÈÈç¿Ø¼þµÄ¸ß¶È¡¢¿í¶ÈµÈ£©£¬Õâô×öÊÇÕýÈ·µÄ¡£µ«ÊÇÈç¹ûÊÇÏë»ñÈ¡ÓëÒµÎñÂß¼­Ïà¹ØµÄÊý¾Ý£¬ÄǾÍÒª¿¼ÂÇÊDz»ÊdzÌÐòµÄÉè¼Æ³öÁËÎÊÌâ------ÒòΪWPF²ÉÓõÄÊÇÊý¾ÝÇý¶¯UIÂß¼­£¬»ñȡҵÎñÂß¼­Êý¾ÝÔڵײã¾ÍÄÜ×öµ½£¬Ò»°ã²»»áÅܵ½±í²ãÀ´ÕÒ¡£

ÏÈÀ´¿´Ò»¸ö¼òµ¥µÄÀý×Ó¡£×÷ΪҵÎñÂß¼­µÄÀàÈçÏ£º

public class Student38  
{
public int Id { get; set; }
public string Name { get; set; }
public string Skill { get; set; }
public bool HasJob { get; set; }
}

½çÃæXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window38"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window38" Height="227" Width="269">
<Window.Resources>
<!--Êý¾Ý¶ÔÏó-->
<local:Student38 x:Key="stu" Id="1" Skill="WPF" Name="Timothy" HasJob="True"></local:Student38>
<!--DataTemplate-->
<DataTemplate x:Key="dtStu">
<Border BorderBrush="Orange" BorderThickness="2" CornerRadius="5">
<StackPanel>
<TextBlock Text="{Binding Id}" Margin="5"></TextBlock>
<TextBlock x:Name="txtBlockName" Text="{Binding Name}" Margin="5"></TextBlock>
<TextBlock Text="{Binding Skill}" Margin="5"></TextBlock>
</StackPanel>
</Border>
</DataTemplate>
</Window.Resources>
<!--Ö÷´°Ìå²¼¾Ö-->
<StackPanel>
<ContentPresenter x:Name="cp" Content="{StaticResource stu}" ContentTemplate="{StaticResource dtStu}" Margin="5">

</ContentPresenter>
<Button Content="Find" Margin="5,0" Click="Button_Click">

</Button>
</StackPanel>
</Window>

ButtonµÄʼþ´¦ÀíÆ÷´úÂëÈçÏ£º

private void Button_Click(object sender, RoutedEventArgs e)  
{
TextBlock tb = this.cp.ContentTemplate.FindName("txtBlockName", this.cp) as TextBlock;
MessageBox.Show(tb.Text);

//Student38 stu = this.cp.Content as Student38;
//MessageBox.Show(stu.Name);
}

δ±»×¢Ê͵ĴúÂëÊÇʹÓÃDataTemplateµÄFindName·½·¨»ñÈ¡ÓÉDataTemplateÉú³ÉµÄ¿Ø¼þ²¢·ÃÎÊÆäÊôÐÔ£¬±»×¢Ê͵ĴúÂëÊÇÖ±½ÓʹÓÃÆäµ×²ãÊý¾Ý¡£ÏÔÈ»£¬ÎªÁË»ñÈ¡StudentµÄij¸öÊôÐÔ£¬Ó¦¸ÃʹÓñ»×¢Ê͵ĴúÂë¶ø²»±ØÒªÈƵ½¿Ø¼þÉÏÀ´£¬³ý·ÇÄãÏëµÃµ½µÄÊǿؼþµÄ³¤¶È£¬¸ß¶È¡£ÓëÒµÎñÂß¼­Î޹صĴ¿UIÊôÐÔ¡£

ÏÂÃæÔÙ¿´Ò»¸ö¸´ÔÓµÄÀý×Ó¡£DataTemplate×î³£Óõĵط½¾ÍÊÇGridViewColumnµÄCellTemplateÊôÐÔ¡£°ÑGridViewColumn·ÅÖÃÔÚÒ»¸öGridView¿Ø¼þÀï¾Í¿ÉÒÔÉú³É±í¸ñÁË¡£GridViewColumnµÄĬÈÏCellTemplateÊÇʹÓÃTextBlockÖ»¶ÁÊôÐÔÏÔʾÊý¾Ý£¬Èç¹ûÎÒÃÇÏëÈÃÓû§ÄÜÐÞ¸ÄÊý¾Ý»òÕßʹÓÃCheckBoxÏÔʾboolÀàÐ͵ÄÊý¾ÝµÄ»°¾ÍÐèÒª×Ô¶¨ÒåDataTemplateÁË¡£

»¹ÊÇÏȶ¨ÒåÕâ¸öStudentµÄÀࣺ

public class Student39  
{
public int Id { get; set; }
public string Name { get; set; }
public string Skill { get; set; }
public bool HasJob { get; set; }
}

×¼±¸Êý¾Ý¼¯ºÏ£¬³ÊÏÖÊý¾ÝµÄ¹¤×÷È«²¿ÓÉXAML´úÂëÀ´Íê³É:

<Window x:Class="WpfApplication1.Window39"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window39" Height="338" Width="446">
<Window.Resources>
<!--Êý¾Ý¼¯ºÏ-->
<c:ArrayList x:Key="stuList">
<local:Student39 Id="1" Name="Timoty Liu" Skill="WPF" HasJob="True"></local:Student39>
<local:Student39 Id="2" Name="Tom Chang" Skill="BI/SQL" HasJob="True"></local:Student39>
<local:Student39 Id="3" Name="Guan Chong" Skill="Writing" HasJob="False"></local:Student39>
<local:Student39 Id="4" Name="Shanshan" Skill="C#/Java" HasJob="False"></local:Student39>
<local:Student39 Id="5" Name="Pingping Zhang" Skill="Writing" HasJob="False"></local:Student39>
<local:Student39 Id="6" Name="kenny Tian" Skill="Asp.net" HasJob="False"></local:Student39>
</c:ArrayList>
<!--DataTemplate-->
<DataTemplate x:Key="nameDT">
<TextBox x:Name="txtBoxName" Text="{Binding Name}"></TextBox>
</DataTemplate>
<DataTemplate x:Key="skillDT">
<TextBox x:Name="txtSkill" Text="{Binding Skill}"></TextBox>
</DataTemplate>
<DataTemplate x:Key="hasJobDT">
<CheckBox IsChecked="{Binding HasJob}"></CheckBox>
</DataTemplate>
</Window.Resources>
<Grid Margin="5">
<ListView x:Name="lvStudent" ItemsSource="{StaticResource stuList}">
<ListView.View>
<GridView>
<GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}"></GridViewColumn>
<GridViewColumn Header="ÐÕÃû" CellTemplate="{StaticResource nameDT}"></GridViewColumn>
<GridViewColumn Header="¼¼Êõ" CellTemplate="{StaticResource skillDT}"></GridViewColumn>
<GridViewColumn Header="Òѹ¤×÷" CellTemplate="{StaticResource hasJobDT}"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>

³ÌÐòÔËÐÐЧ¹ûÈçÏÂͼ£º

È»ºóÎÒÃÇΪÏÔʾÐÕÃûµÄTextBoxÌí¼ÓGetFocusʼþ´¦ÀíÆ÷£º

<DataTemplate x:Key="nameDT">  
<TextBox x:Name="txtBoxName" Text="{Binding Name}" GotFocus="txtBoxName_GotFocus"></TextBox>
</DataTemplate>

ÒòΪÎÒÃÇÊÇÔÚDataTemplateÀïÃæÌí¼ÓÁËʼþ´¦ÀíÆ÷£¬ËùÒÔ½çÃæÉÏÈκÎÒ»¸öÓÉ´ËDataTemplateÉú³ÉµÄTextBox¶¼»áÔÚ»ñµÃ½¹µãµÄʱºòµ÷ÓÃtxtBoxName_GotFocusÕâ¸öʼþ´¦ÀíÆ÷¡£txtBoxName_GotFocusµÄ´úÂëÈçÏ£º

private void txtBoxName_GotFocus(object sender, RoutedEventArgs e)  
{
TextBox tb = e.OriginalSource as TextBox; //»ñȡʼþ·¢ÆðµÄÔ´Í·
ContentPresenter cp = tb.TemplatedParent as ContentPresenter;//»ñȡģ°åÄ¿±ê
Student39 stu = cp.Content as Student39;//»ñȡҵÎñÂß¼­Êý¾Ý
this.lvStudent.SelectedItem = stu;//ÉèÖÃListViewÑ¡ÖÐÏî
//·ÃÎʽçÃæÔªËØ
ListViewItem lvi = this.lvStudent.ItemContainerGenerator.ContainerFromItem(stu) as ListViewItem;
CheckBox cb = this.FindVisualChild<CheckBox>(lvi);
MessageBox.Show(cb.Name);

}

private ChildType FindVisualChild<ChildType>(DependencyObject obj) where ChildType : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj,i);
if (child != null && child is ChildType)
{
return child as ChildType;
}
else
{
ChildType childOfChild = FindVisualChild<ChildType>(child);
if(childOfChild!=null)
{
return childOfChild;
}
}

}
return null;
}

µ±Ê¹ÓÃGridView×÷ΪListViewµÄViewÊôÐÔʱ£¬Èç¹ûijһÁÐʹÓÃTextBox×÷ΪCellTemplate£¬ÄÇô¼´Ê¹ÕâÁÐÖеÄTextBox±»Êó±êµ¥»÷²¢»ñµÃÁ˽¹µãListViewÒ²²»»á°Ñ´ËÏî×öΪ×Ô¼ºµÄSelectedItem¡£ËùÒÔ£¬txtBoxName_GotFocusµÄǰ°ë²¿·ÖÊÇ»ñµÃÊý¾ÝµÄÔ´Í·£¨TextBox£©£¬È»ºóÑØUIÔªËØÊ÷ÉÏË·µ½DataTemplateÄ¿±ê¿Ø¼þ£¨ContentPresenter£©²¢»ñÈ¡ËüµÄÄÚÈÝ£¬ËüµÄÄÚÈÝÒ»¶¨ÊÇÒ»¸öStudentʵÀý¡£

txtBoxName_GotFocusµÄºó°ë²¿·ÖÔò½èÖúVisualTreeHelperÀà¼ìË÷ÓÉDataTemplateÉú³ÉµÄ¿Ø¼þ¡£Ç°ÃæËµ¹ý£¬Ã¿¸öItemControlµÄÅÉÉúÀࣨÈçListBox£¬Combox£¬ListView£©¶¼¾ßÓÐ×Ô¼º¶ÀÌØµÄÌõÄ¿ÈÝÆ÷£¬±¾ÀýÖÐÊÇÒ»¸ö°ü×°×ÅStudent¶ÔÏóµÄListViewItem£¨×¢Ò⣬´ËListViewItem¶ÔÏóµÄContentÒ²ÊÇStudent¶ÔÏ󣩡£¿ÉÒÔ°ÑÕâ¸öListViewItem¿Ø¼þÊÓΪһ¿ÅÊ÷µÄ¸ù£¬Ê¹ÓÃVisualTreeHelperÀà¾Í¿ÉÒÔ±éÀúËüµÄ¸÷¸ö½Úµã¡£±¾ÀýÖÐÊǰɱéÀúËã·¨·Ö×°ÔÚÁËFindVisualChild·ºÐÍ·½·¨Àï¡£

ÔËÐгÌÐò£¬²¢µ¥»÷ij¸öÏÔʾÐÕÃûµÄTextBox£¬Ð§¹ûÈçÏÂͼËùʾ£º

Óɱ¾Àý¿ÉÒÔ¿´³ö£¬ÎÞÂÛÊÇ´ÓʼþÔ´Í·¡°×Ô϶øÉÏ¡±µÄÕÒ£¬»¹ÊÇʹÓÃItemContainerGenerator.ContainerFromItem·½·¨ÕÒµ½ÌõÄ¿ÈÝÆ÷ÔÙ¡°×ÔÉ϶øÏ¡±µÄÕÒ£¬×ÜÖ®£¬ÕÒµ½ÒµÎñÂß¼­Êý¾Ý£¨StudentʵÀý£©²¢²»ÄÑ£¬¶ø¹¤×÷Öдó¶àÊDzÙ×÷ÒµÎñÂß¼­Êý¾Ý¡£Èç¹ûÕæµÄÏëÕÒÓÉDataTemplateÉú³ÉµÄ¿Ø¼þ£¬¶ÔÓڽṹ¼òµ¥µÄ¿Ø¼þ£¬¿ÉÒÔʹÓÃDataTemplate¶ÔÏóµÄFindName·½·¨£»¶ÔÓڽṹ¸´ÔӵĿؼþ£¬ÔòÐèÒª½èÖúVisualTreeHelperÀ´ÊµÏÖ¡£

1.5 ÉîÈëdz³ö»°Style

StyleÖ±Òë¹ýÀ´¾ÍÊÇ¡°·ç¸ñ¡±£¬¡°Ñùʽ¡±¡£ÄÃÈËÀ´¾ÙÀý£¬È˵ķç¸ñÖ¸¾²Ì¬µÄÍâ¹ÛºÍÐÐΪ¾ÙÖ¹¡£Í¬ÑùÒ»¸öÈË£¬Èç¹ûÁôƽͷ¡¢´©ÉÏ×ãÇò¶ÓµÄ¶Ó·þ¡¢½ÅµÅսѥ£¬¿´ÉÏÈ¥¾ÍÊÇÒ»Ãûß³ßåÇò³¡µÄÔ˶¯Ô±£»Èç¹ûÈÃËû»»Ò»Éí±ÊͦµÄÎ÷×°¡¢´©ÉÏÆ¤Ñ¥¡¢ÔÙÁàÉÏÒ»¸ö¹«Îİü£¬¿´ÉÏÈ¥¾ÍÊÇÒ»¸öÉÏÎçÈËÊ¿£»Èç¹ûÈÃËûÊáÆð±¬Õ¨Í·¡¢´÷ÉÏÄ«¾µ¡¢´òÉ϶ú¿×ÔÙ´©Ò»Éí·Ê´óµÄÐÝÏÐ×°£¬»îÍÑÍÑÒ»¸ö·ÇÖ÷Á÷ÐÎÏó¡£ÕâЩ¾ÍÊǾ²Ì¬µÄÍâ¹Û·ç¸ñ£¬ÊÇͨ¹ý¸Ä±äһЩÊôÐÔÖµµÄ´îÅäÆðÀ´ÊµÏֵġ£³ýÁË´Ó¾²Ì¬Íâ¹ÛÀ´ÅжÏÒ»¸öÈ˵ķç¸ñ£¬ÎÒÃÇ»¹»á¹Û²ìËûµÄÐÐÎªÌØµã¡£±ÈÈçÓöµ½À§ÄÑʱ£¬ÓÐЩÈ˺ÜÀÖ¹Û£¬ÕÕÑù̸Ц·çÉú¡£ÓÐЩÈ˺ܽ÷É÷¡¢×Ðϸ·ÖÎöÎÊÌ⣻ÓÐЩÈ˺ܱ¯¹Û¡¢³ÉÌì°§ÉùÌ¾Æø£¬Õâ¾ÍÊÇÐÐΪ·ç¸ñ£¬ÐÐΪ·ç¸ñÊÇÓÉÍâ½ç´Ì¼¤µÄÏìÓ¦ÌåÏÖ³öÀ´µÄ¡£Ëµµ½Õâ¶ù£¬´ó¼ÒÒ»¶¨ÄÜÏëµ½Ò»ÖÖÖ°Òµ---ÑÝÔ±¡£ÑÝÔ±¾ÍÊÇ¿¿µ÷Õû×Ô¼ºµÄ¾²Ì¬ÐÐΪºÍ·ç¸ñÀ´ÊÎÑݸ÷ÖÖ½ÇÉ«µÄ¡£

Èç¹û°ÑWPF´°Ìå¿´×÷Ò»¸öÎę̀£¬ÄÇô´°ÌåÉϵĿؼþ¾ÍÊÇÒ»¸öÑÝÔ±£¬ËüÃǵÄÖ°Ôð¾ÍÊÇÔÚÓû§½çÃæÉϰ´ÕÕÒµÎñÂß¼­µÄÐèÒª°çÑÝ×Ô¼ºµÄ½ÇÉ«¡£ÎªÁËÈÃͬһÖֿؼþÄܵ£Æð²»Í¬µÄ½ÇÉ«£¬³ÌÐòÔ±¾ÍҪΪËüÃÇÉè¼Æ¶àÖÖ¶àÑùµÄÍâ¹ÛÑùʽºÍÐÐΪ¶¯×÷£¬Õâ¾ÍÊÇStyle¡£¹¹³ÉStyle×îÖØÒªµÄÁ½ÖÖÔªËØÊÇSetterºÍTrigger£¬SetterÀà°ïÖúÎÒÃÇÉèÖÿؼþµÄ¾²Ì¬Íâ¹Û·ç¸ñ£¬TriggerÔò°ïÖúÎÒÃÇÉèÖÿؼþµÄÐÐΪ·ç¸ñ¡£

1.5.1 StyleÖеÄSetter

Setter£¬ÉèÖÃÆ÷¡£Ê²Ã´µÄÉèÖÃÆ÷ÄØ£¿ÊôÐÔÖµµÄ¡£ÎÒÃǸøÊôÐÔ¸³ÖµµÄʱºòÒ»°ã¶¼²ÉÓá°ÊôÐÔÃû=ÊôÐÔÖµ¡±µÄÐÎʽ¡£SetterÀàµÄPropertyÊôÐÔÓÃÀ´Ö¸Ã÷ÄãÏëΪÊôÐÔµÄÄĸöÊôÐÔ¸³Öµ£»SetterÀàµÄValueÊôÐÔÔòÊÇÄãÌṩµÄÊôÐÔÖµ¡£

ÏÂÃæµÄÀý×ÓÖÐÔÚWIndowsµÄ×ÊÔ´´ÊµäÖзÅÖÃÒ»¸öÕë¶ÔTextBlockµÄStyle£¬StyleÖÐʹÓÃÈô¸ÉSetterÀ´É趨TextBlockµÄһЩÊôÐÔ£¬ÕâÑù³ÌÐòÖеÄTextBlock¾Í»á¾ßÓÐͳһµÄ·ç¸ñ£¬³ý·ÇÄãʹÓÃ{x:null}ÏÔʾµÄÇå¿ÕStyle¡£

XAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window40"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window40" Height="310" Width="426">
<Window.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="24"></Setter>
<Setter Property="TextDecorations" Value="Underline"></Setter>
<Setter Property="FontStyle" Value="Italic"></Setter>
</Style>
</Window.Resources>
<StackPanel Margin="5">
<TextBlock Text="Hello WPF!"></TextBlock>
<TextBlock Text="This is a sample for style!"></TextBlock>
<TextBlock Text="by Time 2012-11-12!" Style="{x:Null}"></TextBlock>
</StackPanel>
</Window>

ÒòΪStyleµÄÄÚÈÝÊôÐÔÊÇSetters£¬ËùÒÔÎÒÃÇ¿ÉÒÔÖ±½ÓÔÚ<Style>±êÇ©µÄÄÚÈÝÇøÓòʹÓÃSetter¡£

ÔËÐÐЧ¹ûÈçÏÂͼ£º

¸ù¾ÝÉÏÃæÕâ¸öÀý×ÓÎÒÃÇ¿ÉÒÔÍÆÖª£¬Èç¹ûÏëÉèÖÿؼþµÄControlTemplate£¬Ö»ÐèÒª°ÑSetterµÄPropertyÉèΪTemplate²¢ÎªValueÌṩһ¸öControlTemplate¶ÔÏó¼´¿É¡£

1.5.2 StyleµÄTrigger

Trigger,´¥·¢Æ÷£¬¼´µ±Ä³Ð©Ìõ¼þÂú×ãµÄʱºò»á´¥·¢Ò»¸öÐÐΪ£¨±ÈÈçijЩֵµÄ±ä»¯»ò¶¯»­µÄ·¢ÉúµÈ£©¡£´¥·¢Æ÷±È½ÏÏñʼþ¡£Ê¼þÒ»°ãÓÉÓû§²Ù×÷´¥·¢µÄ£¬¶ø´¥·¢Æ÷³ýÁËÓÐʼþ´¥·¢Ð͵ÄEventTriggerÍ⻹ÓÐÊý¾Ý±ä»¯´¥·¢ÐеÄTrigger/DataTrigger¼°¶àÌõ¼þ´¥·¢ÐÍMultiTrigger/MultiDataTriggerµÈ¡£

1.»ù±¾µÄTrigger

TriggerÊÇ×î»ù±¾µÄ´¥·¢Æ÷¡£ÀàËÆÓÚSetter£¬TriggerÒ²ÓÐPropertyºÍValueÁ½¸öÊôÐÔ£¬PropertyÊÇTrigger¹Ø×¢µÄÊôÐÔÃû³Æ£¬ValueÊÇ´¥·¢Ìõ¼þ¡£Trigger»¹ÓÐÒ»¸öSettersÊôÐÔ£¬´ËÊôÐÔÊÇÒ»×éSetter£¬Ò»µ©´¥·¢Ìõ¼þÂú×㣬Õâ×éSetterµÄ¡°ÊôÐÔ---Öµ¡±¾Í»á±»Ó¦Ó㬴¥·¢Ìõ¼þ²»ÔÚÂú×ãºó£¬¸÷ÊôÐÔÖµ»á±»»¹Ô­¡£

ÏÂÃæÕâ¸öÀý×ÓÕë¶ÔµÄÊÇCheckBoxµÄStyle£¬µ±CheckBoxµÄIsCheckÊôÐÔΪTrueʱǰ¾°É«ºÍ×ÖÌå»á¸Ä±ä¡£XAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window41"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window41" Height="258" Width="352">
<Window.Resources>
<Style TargetType="CheckBox">
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Trigger.Setters>
<Setter Property="FontSize" Value="20"></Setter>
<Setter Property="Foreground" Value="Orange"></Setter>
</Trigger.Setters>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Window.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF4589D8" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Window.Background>
<StackPanel>
<CheckBox Content="³úºÌÈÕµ±Îç" Margin="5"></CheckBox>
<CheckBox Content="º¹µÎºÌÏÂÍÁ" Margin="5,0"></CheckBox>
<CheckBox Content="Ë­ÖªÅÌÖвÍ" Margin="5"></CheckBox>
<CheckBox Content="Á£Á£½ÔÐÁ¿à" Margin="5,0"></CheckBox>
</StackPanel>
</Window>

ÒòΪTriggers²»ÊÇStyleµÄÄÚÈÝÊôÐÔ£¬ËùÒÔ<Style.Trigger>...</Style.Trigger>Õâ²ã±êÇ©²»ÄÜÊ¡ÂÔ£¬µ«TriggerµÄSettersÊôÐÔÊÇTriggerµÄÄÚÈÝÊôÐÔ£¬ËùÒÔ<Trigger.Setters>...</Trigger.Setters>Õâ²ã±êÇ©ÊÇ¿ÉÒÔÊ¡ÂԵġ£

ÔËÐÐЧ¹ûÈçÏÂͼ£º

2. MultiTrigger

MultiTriggerÊÇÒ»¸öºÜÈÝÒ×ÈÃÈËÎó½âµÄÃû×Ö£¬»áÈÃÈËÒÔΪÊǶà¸öTrigger¼¯³ÉÔÚÒ»Æð£¬Êµ¼ÊÉϽÐMultiConditionTrigger¸üºÏÊÊ£¬ÒòΪ±ØÐë¶à¸öÌõ¼þͬʱ³ÉÁ¢²Å»á±»´¥·¢¡£MultiTrigger±ÈTrigger¶àÁËÒ»¸öConditionsÊôÐÔ£¬ÐèҪͬʱ³ÉÁ¢µÄÌõ¼þ¾Í·ÅÔÚÕâ¸ö¼¯ºÏµ±ÖС£

ÈÃÎÒÃÇÉÔ΢¸Ä¶¯Ò»ÏÂÉÏÃæµÄÀý×Ó£¬ÒªÇóͬʱÂú×ãCheckBox±»Ñ¡ÖÐÇÒContent±ØÐëΪ¡°Á£Á£½ÔÐÁ¿à¡±Ê±²Å»á±»´¥·¢£¬XAML´úÂëÈçÏ£¨½öStyle²¿·Ö£©£º

<Style TargetType="CheckBox">  
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="True"></Condition>
<Condition Property="Content" Value="Á£Á£½ÔÐÁ¿à"></Condition>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="FontSize" Value="20"></Setter>
<Setter Property="Foreground" Value="Orange"></Setter>
</MultiTrigger.Setters>
</MultiTrigger>
</Style.Triggers>
</Style>

ÔËÐÐЧ¹ûÈçÏÂͼ£º

3. ÓÉÊý¾Ý´¥·¢DataTrigger

³ÌÐòÖо­³£»áÓöµ½»ùÓÚÊý¾ÝÖ´ÐÐijЩÅжÏÇé¿ö£¬Óöµ½ÕâÖÖÇé¿öÎÒÃǾͿÉÒÔ¿¼ÂÇʹÓÃDataTrigger¡£DataTrigger¶ÔÏóµÄBindingÊôÐÔ»á°ÑÊý¾ÝÔ´Ô´²»¶ÏµÄËͳöÀ´£¬Ò»µ©ËͳöÀ´µÄÖµÓëValueÊôÐÔÒ»Ö£¬DataTrigger¼´±»´¥·¢¡£

ÏÂÃæµÄÀý×ÓÖУ¬µ±TextBoxµÄText³¤¶ÈСÓÚ7¸ö×Ö·ûÆäBorder»á±£³ÖºìÉ«¡£XAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window42"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window42" Height="184" Width="324">
<Window.Resources>
<local:L2BConverter x:Key="cbtr"></local:L2BConverter>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Text.Length,Converter={StaticResource cbtr}}" Value="false">
<Setter Property="BorderBrush" Value="Red"></Setter>
<Setter Property="BorderThickness" Value="1"></Setter>
</DataTrigger>

</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<TextBox Margin="5"></TextBox>
<TextBox Margin="5,0"></TextBox>
<TextBox Margin="5"></TextBox>
</StackPanel>
</Window>

Õâ¸öÀý×ÓÖÐΨһÐèÒª½âÊ͵ľÍÊÇDataTriggerµÄBinding¡£ÎªÁ˽«¿Ø¼þ×ÔÉí×öΪÊý¾ÝÔ´£¬ÎÒÃÇʹÓÃÁËRelativeSource£¬³õѧÕß¾­³£ÈÏΪ¡°²»Ã÷È·Ö¸³öSourceµÄÖµBinding¾Í»á½«×Ô¼º×÷ΪÊý¾ÝµÄÀ´Ô´¡±£¬ÕâÊÇ´íÎóµÄ£¬ÒòΪ²»Ã÷È·Ö¸³öSourceµÄÖµBinding¾Í»á°Ñ¿Ø¼þµÄDataContext×öΪ×Ô¼ºµÄÊý¾ÝÀ´Ô´¡£BindingµÄPathÉèÖÃΪText.Length£¬¼´ÎÒÃǹØ×¢µÄÊÇ×Ö·û´®µÄ³¤¶È¡£³¤¶ÈÊÇÒ»¸ö¾ßÌåµÄÊý×Ö£¬ÈçºÎ»ùÓÚÕâ¸ö³¤¶ÈÖµÀ´×öÅжÏÄØ£¿Õâ¾ÍÓõ½ÁËConverter¡£ÎÒÃÇ´´½¨ÈçÏÂConverter£º

public class L2BConverter : IValueConverter  
{

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int textLength = (int)value;
return textLength > 6 ? true : false;
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

¾­¹ýConverterת»»ÒԺ󣬳¤¶ÈÖµ¾Í»á±äΪboolÀàÐÍÖµ¡£DataTriggerµÄvalueÉèÖÃΪfalse£¬Ò²¾ÍÊÇ˵µ±TextBoxµÄÎı¾³¤¶ÈСÓÚ7ʱDataTrigger»áʹÓÃ×Ô¼ºÒ»×éSetter°ÑTextBoxµÄ±ß¿òÉèÖÃΪºìÉ«¡£ÔËÐÐЧ¹ûÈçÏÂͼ£º

4. ¶àÊý¾ÝÌõ¼þ´¥·¢µÄMultiDataTrigger

ÓÐʱºòÎÒÃÇ»áÓöµ½ÒªÇó¶à¸öÊý¾ÝÌõ¼þͬʱÂú×ã²ÅÄÜ´¥·¢±ä»¯µÄÐèÇ󣬴Ëʱ¿ÉÒÔ¿¼ÂÇʹÓÃMultiDataTrigger¡£±ÈÈçÓÐÕâÑùÒ»¸öÐèÇó£ºÓû§½çÃæÉÏʹÓÃListBoxÏÔʾһÁÐStudentÊý¾Ý£¬µ±Student¶ÔÏóÂú×ãIDΪ2¡¢NameΪDarrenµÄʱºò£¬ÌõÄ¿¾Í¸ßÁÁÏÔʾ¡£

ÊÂÀýXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window43"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window43" Height="262" Width="425">
<Window.Resources>
<Style TargetType="ListBoxItem">
<!--ʹÓÃStyleÉèÖÃDatatemplate-->
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Id}" Width="60"></TextBlock>
<TextBlock Text="{Binding Name}" Width="120"></TextBlock>
<TextBlock Text="{Binding Skill}" Width="60"></TextBlock>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<!--MultiDataTrigger-->
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Id}" Value="2"></Condition>
<Condition Binding="{Binding Path=Name}" Value="Darren"></Condition>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="Orange"></Setter>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<ListBox x:Name="lbInfos" Margin="5"></ListBox>
</StackPanel>
</Window>

ºǫ́´úÂëÈçÏ£º

public Window43()  
{
InitializeComponent();
InitialInfo();
}

private void InitialInfo()
{
List<Student38> infos = new List<Student38>() {
new Student38(){ Id=2, Name="Darren", Skill="WPF"},
new Student38(){ Id=1, Name="Tom", Skill="Java"},
new Student38(){ Id=3, Name="Jacky", Skill="Asp.net"},
new Student38(){ Id=2, Name="Andy", Skill="C#"},
};
this.lbInfos.ItemsSource = infos;
}

Student38ÀàÒѾ­ÔÚÉÏÃæµÄÎÄÕÂÖÐÌáµ½£¬Ôٴ˾Ͳ»Ôٶི¡£ÔËÐÐЧ¹ûÈçÏÂͼ£º

5. ÓÉʼþ´¥·¢µÄEventTrigger

EventTriggerÊÇ´¥·¢Æ÷ÖÐ×îÌØÊâµÄÒ»¸ö¡£Ê×ÏÈ£¬Ëü²»ÊÇÓÉÊôÐÔÖµ»òÕßÊý¾ÝµÄ±ä»¯À´´¥·¢¶øÊÇÓÉʼþÀ´´¥·¢£»Æä´Î£¬±»´¥·¢ÒÔºóËü²¢·ÇÓ¦ÓÃÒ»×éSetter£¬¶øÊÇÖ´ÐÐÒ»¶Î¶¯»­¡£Òò´Ë£¬UIµÄ¶¯»­Ð§¹ûÍùÍùºÍEventTriggerÏà¹ØÁª¡£

ÔÚÏÂÃæÕâ¸öÀý×ÓÖд´½¨Ò»¸öÕë¶ÔButtonµÄStyle£¬Õâ¸öStyle°üº¬Á½¸öEventTrigger£¬Ò»¸öÓÉMouseEnter´¥·¢£¬ÁíÒ»¸öÓÉMouseLeave´¥·¢¡£XAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window44"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window44" Height="258" Width="377">
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<!--Êó±ê½øÈë-->
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="150" Duration="0:0:0.2" Storyboard.TargetProperty="Width"></DoubleAnimation>
<DoubleAnimation To="150" Duration="0:0:0.2"Storyboard.TargetProperty="Height"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<!--Êó±êÀ뿪-->
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="Width"></DoubleAnimation>
<DoubleAnimation Duration="0:0:0.2" Storyboard.TargetProperty="Height"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Button Width="40" Height="40" Content="OK"></Button>
</Grid>
</Window>

ÎÞÐèÈκÎc#´úÂ룬ÎÒÃǾͻñµÃÁËÈçÏÂͼËùʾµÄ½á¹û£º

×Ô´Ë£¬¸÷ÖÖ´¥·¢Æ÷¾Í½éÉÜÍêÁË£¬ÌáÐÑ´ó¼ÒÒ»µã£ºËäÈ»ÔÚStyleÀïÃæ´óÁ¿Ê¹Óô¥·¢Æ÷£¬µ«´¥·¢Æ÷²¢·ÇÖ»ÄÜÓ¦ÓÃÔÚStyleÖÐ-----¸÷ÖÖTemplateÒ²¿ÉÒÔÓµÓÐ×Ô¼ºµÄ´¥·¢Æ÷£¬Çë´ó¼Ò¸ù¾ÝÐèÒª¾ö¶¨´¥·¢Æ÷·ÅÔÚStyleÀïÃæ»¹ÊÇTemplateÀïÃæ¡£

   
5653 ´Îä¯ÀÀ       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Ó¦ÓÃϵͳ¼Ü¹¹