ͼÐÎÓû§½çÃæÓ¦ÓóÌÐò½ÏÖ®¿ØÖÆÌ¨½çÃæÓ¦ÓóÌÐò×î´óµÄºÃ´¦¾ÍÊǽçÃæÓѺá¢Êý¾ÝÏÔʾֱ¹Û¡£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ÀïÃæ¡£
|