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

1Ôª 10Ôª 50Ôª





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



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

Èç½ñµÄÈí¼þÊг¡,¾ºÕùÒѾ­½øÈë°×ÈÈ»¯½×¶Î,¹¦ÄÜÇ¿¡¢ÔËËã¿ì¡¢½çÃæÓѺá¢BugÉÙ¡¢¼Û¸ñµÍ¶¼ÒѾ­³ÉΪÁ˱ر¸Ìõ¼þ¡£Õ⻹²»ËãÍê£¬Ëæ×żÆËã»úµÄ¶àýÌ幦ÄÜÔ½À´Ô½Ç¿£¬Èí¼þµÄ½çÃæÊÇ·ñÉ«²ÊÁÁÀö¡¢ÊÇ·ñÄÜͨ¹ý¶¯»­¡¢3DµÈЧ¹ûÊÇ·ñÎüÒýÓû§µÄÑÛÇòÒ²ÒѾ­³ÉΪºâÁ¿Èí¼þµÄ±ê×¼¡£

Èí¼þÏîÄ¿³É¹¦µÄÈý¸öÒªËØÊÇ£º×ÊÔ´¡¢³É±¾¡¢Ê±¼ä¡£ÎÞÂÛÊÇΪÁËÔÚ¾ºÕùÖб£³Ö²»°Ü»¹ÊÇΪÁ˼¤·¢ÆðÓû§¶ÔÈí¼þµÄÐËȤ£¬Ìá¸ßÈí¼þ½çÃæµÄÃÀ»¯³Ì¶È¡¢Ç¡µ±µÄ½«¶¯»­ºÍ3DµÈЧ¹ûÒýÈëÓ¦ÓóÌÐò¶¼ÊÇÒ»¸ö±ØÈ»Ç÷ÊÆ¡£È»¶øÊ¹Óô«Í³µÄ×ÀÃæÓ¦ÓóÌÐò¿ª·¢¹¤¾ßºÍ¿ò¼Ü£¨ÈçWinform¡¢MFC¡¢VB¡¢DelphiµÈ£©½øÐпª·¢Ê±£¬ÎªÁËʹÈí¼þ½çÃæ±äƯÁÁ¡¢¼ÓÈ붯»­»òÕß3DЧ¹û£¬±ß¼Ê³É±¾»á·Ç³£µÄ¸ß¡£ÌåÏÖÔÚ£º

×ÊÔ´ÏûºÄÔö´ó£ºÐèÒªÕÐÆ¸¶®µÃ¶¯»­ºÍ3D±à³ÌµÄ³ÌÐòÔ±£¬»¹ÐèÒª¸ü¶àµÄÉè¼ÆÊ¦¡¢¹¤Ð½ºÍ¹µÍ¨³É±¾Ëæ×ÅÉÏÉý¡£

¿ª·¢Ê±¼äÔö¼Ó£º½çÃæÃÀ»¯¡¢¶¯»­ºÍ3D¿ª·¢Ô¶Ô¶±ÈÒµÎñÂß¼­¿ª·¢À§ÄÑ¡¢ºÄʱ¡£

³É±¾Ôö¼Ó£ºËæ×Å×ÊÔ´ÏûºÄµÄÔö¼ÓºÍ¿ª·¢ÖÜÆÚµÄÀ­³¤£¬³É±¾±ØÈ»Ôö¼Ó¡£

Ö®ËùÒÔ»á³öÏÖÕâÖÖÇé¿ö£¬¸ù±¾Ô­ÒòÔÚÓÚ´«Í³¿ª·¢¹¤¾ßºÍ¿ò¼Ü²¢Ã»ÓÐÔ­ÉúµÄÖ§³ÖÃÀ»¯Óû§½çÃæ¡¢ÏòÓ¦ÓóÌÐòÖÐÌí¼Ó¶¯»­ºÍ3DЧ¹ûµÈ¹¦ÄÜ¡£¾Ù¸ö¼òµ¥µÄÀý×Ó£¬µ±Óû§Ìá³öÐèÒª°ÑTextBoxµÄÍâ¹Û¸Ä³ÉÔ²½Çʱ£¬WinformºÍDelphi³ÌÐòÔ±Ö»ÄÜͨ¹ýÅÉÉúÐÂÀಢÔڵײã×öÐ޸ĵķ½·¨À´ÊµÏÖ¡£ÀàËÆµÄÓû§ÐèÇó»¹Óкö಻µÃ²»ÊµÏÖ£¬·ñÔò¿Í»§»á»³ÒÉÎÒÃǵĿª·¢ÄÜÁ¦£»¼´Ê¹ÊµÏÖÁËҲûÓÐʲô¶îÍâµÄ¾­¼ÃÐ§Òæ£¬ÒòΪÕâЩ¶«Î÷ÔÚ¿Í»§µÄÑÛÀï¶¼ÊǺܼòµ¥µÄ¶«Î÷¡£

WPFµÄÍÆ³ö¿ÉνÊǶÔÖ¢ÏÂÒ©¡¢×¨ÃŽâ¾öÉÏÊöÎÊÌâ¡£ÌåÏÖÔÚ£º

XAMLÓïÑÔÕë¶ÔµÄÊǽçÃæÃÀ»¯µÄÎÊÌ⣬¿ÉÒÔÈÃÉè¼ÆÊ¦Ö±½Ó¼ÓÈ뿪·¢ÍŶӡ¢½µµÍ¹µÍ¨³É±¾¡£

XAMLµÄͼÐλæÖƹ¦Äܷdz£Ç¿´ó£¬¿ÉÒÔÇáÒ×»æ³ö¸´ÔÓµÄͼ±ê¡¢Í¼»­¡£

WPFÖ§³ÖÂ˾µ¹¦ÄÜ£¬¿ÉÒÔÏñPhotoShopÒ»ÑùΪ¶ÔÏóÌí¼Ó¸÷ÖÖЧ¹û¡£

WPFÔ­ÉúÖ§³Ö¶¯»­¿ª·¢£¬ÎÞÂÛÊÇÉè¼ÆÊ¦»¹ÊdzÌÐòÔ±£¬¶¼Äܹ»Ê¹ÓÃXAML»òC#ÇáËÉ¿ª·¢ÖÆ×÷ѤÀöµÄ¶¯»­Ð§¹û¡£

WPFÔ­ÉúÖ§³Ö3DЧ¹û£¬ÉõÖÁ¿ÉÒÔ½«ÆäËü3D½¨Ä£¹¤¾ß´´½¨µÄÄ£Ð͵¼½øÀ´¡¢ÎªÎÒËùÓá£

Blend×÷ΪרÃŵÄÉè¼Æ¹¤¾ßÈÃWPFÈ绢ÌíÒí£¬¼´Äܹ»°ïÖú²»Á˽â±à³ÌµÄÉè¼ÆÊ¦¿ìËÙÉÏÊÖ£¬ÓÖÄܹ»°ïÖú×ÊÉ·¢Õß¿ìËÙ½¨Á¢Í¼ÐλòÕß¶¯»­µÄÔ­ÐÍ¡£

1.1 WPF»æÍ¼

Ó봫ͳµÄ.net¿ª·¢Ê¹ÓÃGDI+½øÐлæÍ¼²»Í¬£¬WPFÓµÓÐ×Ô¼ºµÄÒ»Ì×»æÍ¼API¡£Ê¹ÓÃÕâÌ×API²»µ«¿ÉÒÔÇáËÉ»æÖƳö¾«ÃÀµÄͼÐΣ¬»¹¿ÉÒÔΪ¸÷ÖÖͼÐÎÌí¼ÓÀàËÆÓëPhotoShopµÄ¡°Â˾µÐ§¹û¡±¼°¡°±äÐÎЧ¹û¡±¡£±¾½ÚÎÒÃǾÍÒ»ÆðÑо¿WPFͼÐÎAPI»æÍ¼£¬Ð§¹ûºÍ±äÐεȹ¦ÄÜ¡£

Ïȹ۲ìÏÂÃæÒ»×éͼƬ£º

ÏÔÈ»£¬Õâ×éͼƬÊÇʸÁ¿Í¼£¨Vector Image£©£¬ÎÞÂÛÔõÑù·Å´óËõС¶¼²»»á³öÏÖ¾â³Ý¡£Äã¿ÉÄÜ»áÏ룺¡°ÕâÊÇ×éPNG¸ñʽµÄͼƬÂ𣿡±´ð°¸ÊÇ¡°NO¡±¡£Õâ×éͼÊÇÓÃXAMLÓïÑÔ»æÖƵģ¡XAML»æÍ¼±¾Éí¾ÍÊÇʸÁ¿µÄ£¬¶øÇÒÖ§³Ö¸÷ʽ¸÷ÑùµÄÌî³äºÍЧ¹û£¬ÉõÖÁ»¹¿ÉÒÔÌí¼ÓÂ˾µ£¬ÕâЩ¹¦ÄÜË¿ºÁ²»ÑÇÓÚPhotoshop¡£ÒÔǰ£¬Ê¹ÓÃPhotoShopÖÆ×÷³öÀ´µÄͼÐÎÐèÒª³ÌÐòԱʹÓÃ.netµÄ»æÍ¼½Ó¿Ú½øÐжþ´Îת»»²ÅÄÜÓ¦Óõ½³ÌÐòÀÏÖÔÚºÃÁË£¬Ö±½Ó°ÑXAML´úÂëÄÃÀ´ÓþͿÉÒÔÁË¡£

»æÍ¼²¢²»ÊÇVisualStudioµÄÇ¿ÏÕâЩƯÁÁµÄXAMLʸÁ¿Í¼ÊÇÔõô»­³öÀ´µÄÄØ£¿´ð°¸ÊǽèÖúMicrosoft Expression StudioÖеÄBlendºÍDesignÁ½¸ö¹¤¾ß¡£BlendÎÒÃÇÒѾ­½éÉܹýÁË£¬ÓÃËü¿ÉÒÔÖ±½Ó»æÖÆXAMLͼÐΣ»Design¿ÉÒÔÏñPhotoShop»òÕßFireWorksÄÇÑù»æÖÆÍ¼ÐΣ¬ÔÙÓÉÉè¼ÆÕß¾ö¶¨µ¼³öxaml¸ñʽ»¹ÊÇpng¸ñʽ¡£ËäÈ»¡°Î¨´úÂëÅÉ¡±µÄ³ÌÐòÔ±ÃÇÔÚVisualstudioÀïÒ»ÐÐÒ»ÐÐд´úÂëÒ²ÄܰѸ´ÔÓµÄͼÐÎÒÔ·Ç¿ÉÊÓ»¯µÄÐÎʽ´´½¨³öÀ´£¬µ«ÔÚBlendºÍDesignÖл­³öÔ­ÐÍÔÙÔÚVisual StudioÀïÃæ½øÐÐϸ½ÚµÄÐÞÊβÅÊÇÌá¸ßЧÂÊÖ®µÀ¡£

»ýɳ³ÉËþ£¬¼¯Ò¸³Éô㬱ð¿´Ç°ÃæÄÇЩͼƬºÜ¸´ÔÓ£¬µ«¶¼ÊÇÓɼ¸¸öÓÐÏ޵Ļù±¾Í¼ÐÎ×é³ÉµÄ¡£WPFµÄ»ù±¾Í¼ÐΰüÀ¨ÒÔϼ¸¸ö£¨ËüÃǶ¼ÊÇShapÀàµÄÅÉÉúÀࣩ£º

Line£ºÖ±Ï߶Σ¬¿ÉÒÔÉèÖÃÆä±Ê´¥(Stroke)¡£

Rectangle£º¾ØÐΣ¬¼ÈÓбʴ¥£¬ÓÖÓÐÌî³ä£¨Fill£©¡£

Ellipse£ºÍÖÔ²£¬³¤¿íÏàµÈµÄÍÖÔ²¼´ÎªÕýÔ²£¬¼ÈÓбʴ¥ÓÖÓÐÌî³ä¡£

Polygon:¶à±ßÐΣ¬ÓɶàÌõÖ±ÏßÏß¶ÎΧ³ÉµÄ±ÕºÏÇøÓò£¬¼ÈÓбʴ¥ÓÖÓÐÌî³ä¡£

PolyLine£ºÕÛÏߣ¨²»±ÕºÏ£©£¬ÓɶàÌõÊ×βÏà½ÓµÄÖ±Ïß×é³É¡£

Path£ºÂ·¾¶£¨±ÕºÏÇøÓò£©£¬»ù±¾Í¼ÐÎÖй¦ÄÜ×îÇ¿µÄÒ»¸ö£¬¿ÉÓÉÈô¸ÉÖ±Ïߣ¬Ô²»¡£¬±»Èû¶ûÇúÏß×é³É¡£

1 Ö±Ïß

Ö±ÏßÊÇ×î¼òµ¥µÄͼÐΡ£Ê¹ÓÃX1,Y1Á½¸öÊôÐÔÖµ¿ÉÒÔÉèÖÃËüµÄÆðµã×ø±ê£¬X2,Y2Á½¸öÊôÐÔÖµ¿ÉÒÔÉèÖÃËüµÄÖÕµã×ø±ê¡£¿ØÖÆÖÕµã/Æðµã×ö±ê¾Í¿ÉÒÔʵÏÖÆ½ÐУ¬½»´íµÈЧ¹û¡£Stroke£¨±Ê´¥£©ÊôÐÔµÄÊý¾ÝÀàÐÍÊÇBrush£¨»­Ë¢£©£¬·²ÊÇBrushµÄÅÉÉúÀà¾ù¿ÉÒÔÓÃÓÚ¸øÕâ¸öÊôÐÔ¸³Öµ¡£ÒòΪWPFÌṩ¶àÖÖ½¥±äÉ«»­Ë¢£¬ËùÒÔ»­Ö±ÏßÒ²¿ÉÒÔ»­³ö½¥±äЧ¹û¡£Í¬Ê±£¬LineµÄһЩÊôÐÔ»¹¿ÉÒÔ°ïÖúÎÒÃÇ»­³öÐéÏßÒÔ¼°¿ØÖÆÏß¶ÎÖÕµãµÄÐÎ×´¡£ÏÂÃæµÄÀý×Ó×ÛºÏÁËÕâЩÊôÐÔ£º

<Window x:Class="WpfApplication1.Window45"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window45" Height="293" Width="437">
<Grid>
<Line X1="10" Y1="20" X2="260" Y2="20" Stroke="Red" StrokeThickness="10"></Line>
<Line X1="10" Y1="40" X2="260" Y2="40" Stroke="Orange" StrokeThickness="6"></Line>
<Line X1="10" Y1="60" X2="260" Y2="60" Stroke="Green" StrokeThickness="3"></Line>
<Line X1="10" Y1="80" X2="260" Y2="80" Stroke="Purple" StrokeThickness="2"></Line>
<Line X1="10" Y1="100" X2="260" Y2="100" Stroke="Black" StrokeThickness="1"></Line>
<Line X1="10" Y1="120" X2="260" Y2="120" StrokeDashArray="3" Stroke="Black" StrokeThickness="1"></Line>
<Line X1="10" Y1="140" X2="260" Y2="140" StrokeDashArray="5" Stroke="Black" StrokeThickness="1"></Line>
<Line X1="10" X2="260" Y1="160" Y2="160" Stroke="Black" StrokeThickness="6" StrokeEndLineCap="Flat"></Line>
<Line X1="10" X2="260" Y1="180" Y2="180" Stroke="Black" StrokeThickness="8" StrokeEndLineCap="Triangle"></Line>
<Line X1="10" X2="260" Y1="200" Y2="200" StrokeEndLineCap="Round" StrokeThickness="10">
<Line.Stroke>
<LinearGradientBrush EndPoint="0,0.5" StartPoint="1,0.5">
<GradientStop Color="Blue"></GradientStop>
<GradientStop Offset="1" Color="Red"></GradientStop>
</LinearGradientBrush>
</Line.Stroke>
</Line>
</Grid>
</Window>

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

ÓÐÒ»µãÐèÒªÌØ±ð×¢Ò⣬³õѧÕßÈÏΪ»æÍ¼Ò»¶¨ÒªÔÚCanvasÖÐÍê³É(Ë­½ÐËüµÄÃû×ֽл­²¼ÄØ)£¬Æäʵ²»È»£¬»æÍ¼¿ÉÒÔÔÚÈκÎÒ»ÖÖ²¼¾Ö¿Ø¼þÖÐÍê³É£¬WPF»á×Ô¶¯¸ù¾ÝÈÝÆ÷µÄ²»Í¬¼ÆËãͼÐεÄ×ø±ê£¬ÈÕ³£Éú»îÖУ¬³£ÓõĻæÍ¼ÈÝÆ÷ÓÐCanvasºÍGrid¡£

2 ¾ØÐÎ

¾ØÐÎÓбʴ¥£¨Stroke£¬¼´±ßÏߣ©ºÍÌî³ä£¨Fill£©¹¹³É¡£StrokeÊôÐÔµÄÉèÖúÍLineÒ»Ñù£¬FillÊôÐÔµÄÊý¾ÝÀàÐÍÊÇBrush¡£BrushÊÇÒ»¸ö³éÏóÀ࣬ËùÒÔÎÒÃDz»¿ÉÄÜÄÃÒ»¸öBrushÀàµÄʵÀýΪFillÊôÐÔ¸³Öµ¶øÖ»ÄÜÓÃBrushÅÉÉúÀàÀ´½øÐи³Öµ¡£WPF»æÍ¼ÏµÍ³Öаüº¬·Ç³£·á¸»µÄBrushÀàÐÍ£¬³£ÓõÄÓУº

SolidColorBrush£ºÊµÐÄ»­Ë¢¡£ÔÚXAMLÖпÉÒÔʹÓÃÑÕÉ«Ãû³Æ×Ö·û´®Ö±½Ó¸³Öµ¡£

LinearGradientBrush£ºÏßÐÔ½¥±ä»­Ë¢¡£É«²ÊÑØÉ趨µÄÖ±Ïß·½Ïò£¬°´É趨µÄ±ä»¯µã½øÐн¥±ä¡£

RadialGradientBrush£º¾¶Ïò½¥±ä»­Ë¢¡£É«²ÊÑØ°ë¾¶µÄ·½Ïò¡¢°´É趨µÄ±ä»¯µã½øÐн¥±ä£¬ÐγÉÔ²ÐÎÌî³ä¡£

ImageBrsh£ºÊ¹ÓÃͼƬ×÷ΪÌî³äÀàÈÝ¡£

DrawingBrush£ºÊ¹ÓÃʸÁ¿Í¼£¨Vector£©ºÍλͼ£¨BitMap£©×÷ΪÌî³äÄÚÈÝ¡£

VisualBrush£ºWPFÖеÄÿ¸ö¿Ø¼þ¶¼ÊÇÓÐFrameWrokElementÅÉÉú¶øÀ´µÄ£¬¶øFrameWorkElmentÀàÓÖÊÇÓÉVisualÀàÅÉÉú¶øÀ´µÄ¡£VisualÒâΪ¡°¿ÉÊÓ¡±Ö®Ò⣬ÿ¸ö¿Ø¼þµÄ¿ÉÊÓ»¯ÐÎÏó¾Í¿ÉÒÔͨ¹ýVisualÀàµÄ·½·¨»ñµÃ¡£»ñµÃÕâ¸ö¿ÉÊÓ»¯ÐÎÏóÖ®ºó£¬ÎÒÃÇ¿ÉÒÔÓÃÕâ¸öÐÎÏó½øÐÐÌî³ä£¬Õâ¾ÍÊÇVisualBrush¡£±ÈÈçÎÒÏë°Ñ´°ÌåÉϵÄij¸ö¿Ø¼þÍϵ½ÁíÍâÒ»¸öλÖ㬵±Êó±êËÉ¿ªÖ®Ç°ÐèÒªÔÚÊó±êÖ¸ÕëÏÂÏÔʾһ¸ö»ÃÓ°£¬Õâ¸ö»ÃÓ°¾ÍÊÇʹÓÃVisualBrushÌî³ä³öÀ´µÄÒ»¸ö¾ØÐΣ¬²¢ÈþØÐβ¶×½Êó±êµÄλÖá¢ËæÊó±êÒÆ¶¯¡£

ÏÂÃæÊÇʹÓò»Í¬»­Ë¢Ìî³ä¾ØÐεÄ×ÛºÏʵÀý£º

<Window x:Class="WpfApplication1.Window46"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window46" Height="390" Width="600">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="180" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="180" />
<ColumnDefinition Width="10" />
<ColumnDefinition Width="180*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="160" />
<RowDefinition Height="10" />
<RowDefinition Height="160" />
</Grid.RowDefinitions>
<!--ʵÐÄÌî³ä-->
<Rectangle Grid.Row="0" Grid.Column="0" Stroke="Black" Fill="LightBlue"></Rectangle>
<!--ÏßÐÔ½¥±ä-->
<Rectangle Grid.Row="0" Grid.Column="2">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFB6F8F1" Offset="0"></GradientStop>
<GradientStop Color="#FF0082BD" Offset="0.25"></GradientStop>
<GradientStop Color="#FF95DEFF" Offset="0.6"></GradientStop>
<GradientStop Color="#FF004F72" Offset="1"></GradientStop>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!--¾¶Ïò½¥±ä-->
<Rectangle Grid.Row="0" Grid.Column="4">
<Rectangle.Fill>
<RadialGradientBrush>
<GradientStop Color="#FFB6F8F1" Offset="0"></GradientStop>
<GradientStop Color="#FF0082BD" Offset="0.25"></GradientStop>
<GradientStop Color="#FF95DEFF" Offset="0.75"></GradientStop>
<GradientStop Color="#FF004F72" Offset="1.5"></GradientStop>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!--ͼƬÌî³ä-->
<Rectangle Grid.Row="2" Grid.Column="0">
<Rectangle.Fill>
<ImageBrush ImageSource="./01077_1.png" Viewport="0,0,0.3,0.3" TileMode="Tile">

</ImageBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Grid.Row="2" Grid.Column="2">
<Rectangle.Fill>
<DrawingBrush Viewport="0,0,0.2,0.2" TileMode="Tile">
<DrawingBrush.Drawing>
<GeometryDrawing Brush="LightBlue">
<GeometryDrawing.Geometry>
<EllipseGeometry RadiusX="10" RadiusY="10"></EllipseGeometry>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</Rectangle.Fill>
</Rectangle>
<!--ÎÞÌî³ä£¬Ê¹ÓÃÏßÐÔ½¥±äÌî³ä±ß¿ò-->
<Rectangle Grid.Row="2" Grid.Column="5" StrokeThickness="10">
<Rectangle.Stroke>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="White" Offset="0.3"></GradientStop>
<GradientStop Color="Blue" Offset="1"></GradientStop>
</LinearGradientBrush>
</Rectangle.Stroke>
</Rectangle>
</Grid>
</Window>

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

ʹÓû­Ë¢µÄʱºò£¬½¨ÒéÏÈÔÚBlendÀïÃæ»æÖÆÍ¼´óÖµÄЧ¹ûÈ»ºóÔÙÔÚVisual StudioÀïÃæÎ¢µ÷¡£

½ÓÏÂÀ´ÈÃÎÒÃÇ¿´Ò»¸öVisualBrushµÄÀý×Ó¡£ÎªÁ˼òµ¥Æð¼û£¬Ä¿±ê¿Ø¼þÊÇÒ»¸öButton£¬Êµ¼Ê¹¤×÷Öл»³É¸´ÔӵĿؼþÒ²Ò»Ñù¡£³ÌÐòµÄXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window47"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window47" Height="300" Width="400" Background="Orange">
<Grid Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="160" />
</Grid.ColumnDefinitions>
<StackPanel Background="White" x:Name="spleft">
<Button Height="40" Content="OK" x:Name="btnReal" Click="btnReal_Click"></Button>
</StackPanel>
<Button Grid.Column="1" Content=">>" Margin="5,0"></Button>
<StackPanel Grid.Column="2" Background="White" x:Name="spRight">

</StackPanel>
</Grid>
</Window>

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

double o = 1;//²»Í¸Ã÷¶ÈÖ¸Êý  
private void btnReal_Click(object sender, RoutedEventArgs e)
{
VisualBrush vb = new VisualBrush(this.btnReal);
Rectangle rtg = new Rectangle();
rtg.Width = btnReal.Width;
rtg.Height = btnReal.Height;
rtg.Fill = vb;
rtg.Opacity = o;
o -= 0.2;
this.spRight.Children.Add(rtg);
}

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

3. ÍÖÔ²

ÍÖÔ²Ò²ÊÇÒ»ÖÖ³£¼ûµÄ¼¸ºÎͼÐΣ¬ËüµÄʹÓ÷½·¨ºÍ¾ØÐÎûÓÐÊ²Ã´Çø±ð¡£ÏÂÃæµÄÀý×ÓÊÇ»æÖÆÒ»¸öÇòÌ壬ÇòÌåµÄÂÖÀªÊÇÕýÔ²£¨Circle£©£¬WidthºÍHeightÏàµÈµÄÍÖÔ²¼´ÎªÕýÔ²£ºÇòÌåµÄ¹âӰʹÓþ¶Ïò½¥±äʵÏÖ£¬XAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window48"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window48" Height="300" Width="300">
<Grid>
<Ellipse Height="140" Name="ellipse1" Stroke="Gray" Width="140" Cursor="Hand" ToolTip="A Ball">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.2,0.8" RadiusX="0.75" RadiusY="0.75">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<RotateTransform Angle="90" CenterX="0.5" CenterY="0.5"></RotateTransform>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#FFFFFFFF" Offset="0" />
<GradientStop Color="#FF444444" Offset="0.66" />
<GradientStop Color="#FF999999" Offset="1" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
</Window>

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

ÓëÇ°ÃæÌáµ½µÄÒ»Ñù£¬ÍÖÔ²µÄ»æÖƺÍÉ«²ÊÌî³äÔÚBlendÀïÃæÍê³ÉµÄ£¬ÔÚVSÀïÃæÓÖ×öÁËһЩÏàÓ¦µÄµ÷Õû¡£

4 ·¾¶

·¾¶(Path)¿ÉÒÔ˵ÊÇWPF»æÍ¼×îÇ¿´óµÄ¹¤¾ß£¬Ò»À´ÊÇÒòΪËüÍêÈ«¿ÉÒÔÌæ´úÆäËü¼¸ÖÖͼÐΣ¬¶øÀ´Ëü¿ÉÒÔ½«Ö±Ïߣ¬Ô²»¡£¬±´Èû¶ûÇúÏߵȻù±¾ÔªËØ×éºÏÆðÀ´£¬Ðγɸü¸´ÔÓµÄͼÐΡ£Â·¾¶×îÖØÒªµÄÒ»¸öÊôÐÔ¾ÍÊÇData£¬DataµÄÊý¾ÝÀàÐÍÊÇGeometry£¨¼¸ºÎͼÐΣ©£¬ÎÒÃÇÕýÊÇʹÓÃÕâ¸öÊôÐÔ½«Ò»Ð©»ù±¾µÄÏß¶ÎÆ´½ÓÆðÀ´£¬Ðγɸ´ÔÓµÄͼÐΡ£

ΪDataÊôÐÔ¸³ÖµµÄ·½·¨ÓÐÁ½ÖÖ£ºÒ»ÖÖÊDZêǩʽµÄ±ê×¼Óï·¨£¬ÁíÍâÒ»ÖÖÊÇרÃÅÓÃÓÚ»æÖƼ¸ºÎͼÐεġ°Â·¾¶±ê¼ÇÓï·¨¡±¡£±¾Ð¡½ÚÎÒÃÇʹÓñê×¼±êÇ©Óï·¨ÈÏʶ¸÷ÖÖÏ߶Σ¬ÏÂÒ»½ÚÎÒÃǽ«Ñ§Ï°»æÖƼ¸ºÎͼÐεÄ·¾¶±ê¼ÇÓï·¨¡£

ÏëҪʹÓÃPath·¾¶»æÖÆÍ¼ÐΣ¬Ê×ÏÈÒªÖªµÀ¼¸ºÎͼÐÎÊý¾ÝÊÇÈçºÎ×éºÏµ½DataÊôÐÔÖеġ£PathµÄDataÊôÐÔÊÇGeometryÀ࣬µ«ÊÇGeometryÀàÊÇÒ»¸ö³éÏóÀ࣬ËùÒÔÎÒÃDz»¿ÉÄÜÔÚXAMLÖÐÖ±½ÓʹÓÃ<Geometry>±êÇ©¡£

<!--²»¿ÉÄܳöÏÖ-->  
<Path>
<Geometry>
<!---->
</Geometry>
</Path>

ÎÒÃÇ¿ÉÒÔʹÓÃGeometryµÄ×ÓÀà¡£GeometryµÄ×ÓÀà°üÀ¨£º

LineGeometry£ºÖ±Ïß¼¸ºÎͼÐΡ£

RectangleGeometry£º¾ØÐμ¸ºÎͼÐΡ£

EllipseGeometry£ºÍÖÔ²¼¸ºÎͼÐΡ£

PathGeometry£ºÂ·¾¶¼¸ºÎͼÐΡ£

StreamGeometry£ºPathGeometryµÄÇáÁ¿¼¶Ìæ´úÆ·£¬²»Ö§³ÖBinding¡¢¶¯»­µÈЧ¹û¡£

CombinedGeometry£ºÓɶà¸ö»ù±¾¼¸ºÎͼÐιØÁªÔÚÒ»Æð£¬Ðγɵĵ¥Ò»¼¸ºÎͼÐΡ£

GeometryGroup£ºÓɶà¸ö»ù±¾¼¸ºÎͼÐÎ×éºÏÔÚÒ»Æð£¬Ðγɵļ¸ºÎͼÐÎ×é¡£

¿ÉÄÜÈôó¼Ò±È½ÏÃÔ»óµÄÊÇ£ºÇ°ÃæÒѾ­¼û¹ýLine£¬Rectangle£¬EllipseµÈÀ࣬ÔõôÏÖÔÚÓÖ³öÀ´ÁËLineGeometry¡¢RectangleGeometry¡¢EllipseGeometryÀàÄØ£¿ËüÃǵÄÇø±ðÔÚÓÚÇ°Ãæ½éÉܵÄLine£¬Rectangle£¬Ellipse¶¼ÊÇ¿ÉÒÔ¶ÀÁ¢´æÔڵĶÔÏ󣬶øÕâЩ*GeometryÀàÖ»ÄÜÓÃÓÚ½áºÏ³ÉÆäËü¼¸ºÎͼÐΡ¢²»ÄܶÀÁ¢´æÔÚ-----µ±ÎÒÃÇÔÚBlendÀïÃæÑ¡ÖÐÒ»×é¶ÀÁ¢µÄ¼¸ºÎͼÐβ¢Ôڲ˵¥ÀïÖ´ÐÐ×éºÏ·¾¶ÃüÁîʱ£¬±¾ÖÊÉϾÍÊǰÑÔ­À´¶ÀÁ¢µÄLine£¬Rectangle£¬Ellipse¶ÔÏóת»»³ÉÁË*Geometry¶ÔÏó²¢½áºÏ³ÉÒ»¸öеĸ´ÔÓ¼¸ºÎͼÐΡ£

»Øµ½DataµÄPathÊôÐÔ£¬ÏÂÃæÕâ¸öÀý×Ó¼òÒªµÄչʾÁ˸÷ÖÖ¼¸ºÎͼÐΣº

<Window x:Class="WpfApplication1.Window49"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window49" Height="350" Width="340">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="160" />
<RowDefinition Height="160" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160" />
<ColumnDefinition Width="160" />
</Grid.ColumnDefinitions>
<!--Ö±Ïß-->
<Path Stroke="Blue" StrokeThickness="2" Grid.Row="0" Grid.Column="0">
<Path.Data>
<LineGeometry StartPoint="0,0" EndPoint="160,160"></LineGeometry>
</Path.Data>
</Path>
<!--¾ØÐη¾¶-->
<Path Stroke="Orange" Fill="Yellow" Grid.Row="0" Grid.Column="1">
<Path.Data>
<RectangleGeometry Rect="20,20,120,120" RadiusX="10" RadiusY="10"></RectangleGeometry>
</Path.Data>
</Path>
<!--ÍÖԲ·¾¶-->
<Path Stroke="Green" Fill="LawnGreen" Grid.Column="0" Grid.Row="1">
<Path.Data>
<EllipseGeometry Center="80,80" RadiusX="60" RadiusY="40"></EllipseGeometry>
</Path.Data>
</Path>
<!--×Ô¶¨Òå·¾¶-->
<Path Stroke="Yellow" Fill="Orange" Grid.Row="1" Grid.Column="1">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigure StartPoint="25,140" IsClosed="True">
<PathFigure.Segments>
<LineSegment Point="20,40"></LineSegment>
<LineSegment Point="40,110"></LineSegment>
<LineSegment Point="50,20"></LineSegment>
<LineSegment Point="80,110"></LineSegment>
<LineSegment Point="110,20"></LineSegment>
<LineSegment Point="120,110"></LineSegment>
<LineSegment Point="140,40"></LineSegment>
<LineSegment Point="135,140"></LineSegment>
</PathFigure.Segments>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
</Window>

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

ÆäʵLineGeometry¡¢RectangleGeometry¡¢EllipseGeometry¶¼±È½Ï¼òµ¥£¬ÏÖÔÚ×ÅÖØÀ´¿´PathGeometry¡£¿ÉÒÔ˵£¬WPF»æÍ¼µÄÖØµãÊÇPath£¬PathµÄÖØµãÔÚÓÚPathGeometry¡£PathGeometryÖ®ËùÒÔÕâÃ´ÖØÒªµÄÔ­ÒòÊÇÒòΪPathµÄFiguresÊôÐÔ¿ÉÒÔÈÝÄÉPathFigure¶ÔÏ󣬶øPathFigure¶ÔÏóµÄSegmentsÊôÐÔÓÖ¿ÉÒÔÈÝÄɸ÷ÖÖÏß¶ÎÓÃÀ´×éºÏ³É¸´ÔÓµÄͼÐΡ£XAML´úÂë½á¹¹ÈçÏ£º

<Path>  
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigure>
<PathFigure.Segments>
<!--Ïß¶ÎÄÚÈÝ-->
</PathFigure.Segments>
</PathFigure>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>

ÒòΪFiguresÊÇPathGeometryµÄĬÈÏÄÚÈÝÊôÐÔ¡¢SegmentsÊÇPathFigureµÄĬÈÏÄÚÈÝÊôÐÔ£¬ËùÒÔ³£¼ò»¯ÎªÕâÑù£º

<Path>  
<Path.Data>
<PathGeometry>
<PathFigure>
<!--Ïß¶ÎÄÚÈÝ-->
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>

Á˽âÁËÉÏÃæÁ½¸ö¸ñʽ֮ºó£¬ÎÒÃÇ¿ÉÒÔ°ÑÑ۹⼯ÖÐÔÚ¸÷ÖÖÏß¶ÎÉÏ£¬ËüÃÇÊÇ£º

LineSegment£ºÖ±Ï߶Ρ£

ArcSegment£ºÔ²»¡Ï߶Ρ£

BezierSegment£ºÈý´Î·½±´Èû¶ûÇúÏ߶Σ¨Ä¬Èϵı´Èû¶ûÇúÏßÖ¸µÄ¾ÍÊÇÈý´Î·½±´Èû¶ûÇúÏߣ¬ËùÒÔCubicÒ»´Ê±»Ê¡ÂÔ£©¡£

QuadraticBezierSegment£º¶þ´Î·½±´Èû¶ûÇúÏ߶Ρ£

PolyLineSegment£º¶àÖ±Ï߶Ρ£

PolyBezierSegment£º¶àÈý´Î·½±´Èû¶ûÇúÏ߶Ρ£

PolyQuadraticBezierSegment£º¶à¶þ´Î·½±´Èû¶ûÇúÏ߶Ρ£

ÔÚ»æÖÆÕâЩÏ߶εÄʱºòÐèҪעÒ⣬ËùÓеÄÕâЩÏ߶ζàÊÇûÓÐÆðµãµÄ£¨StartPoint£©£¬ÒòΪÆðµã¾ÍÊÇǰһ¸öÏ߶εÄÖյ㣬¶øµÚÒ»¸öÏß¶ÎµÄÆðµãÔòÊÇPathFigureµÄStartPoint¡£Çë¿´ÏÂÃæÕâЩÀý×Ó£º

LineSegment×îΪ¼òµ¥£¬Ö»ÐèÒª¿ØÖÆËüµÄÖÕµã(Point)¼´¿É¡£

<Window x:Class="WpfApplication1.Window50"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window50" Height="307" Width="384">
<Grid VerticalAlignment="Center" HorizontalAlignment="Center">
<Path Stroke="Green" Fill="LawnGreen" StrokeThickness="2">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="0,0" IsClosed="True">
<LineSegment Point="150,0"></LineSegment>
<LineSegment Point="150,30"></LineSegment>
<LineSegment Point="90,30"></LineSegment>
<LineSegment Point="90,150"></LineSegment>
<LineSegment Point="60,150"></LineSegment>
<LineSegment Point="60,30"></LineSegment>
<LineSegment Point="0,30"></LineSegment>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
</Window>

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

ArcSegmentÓÃÀ´»æÖÆÔ²»¡¡£pointÊôÐÔÓÃÀ´Ö¸Ã÷Ô²»¡Á¬½ÓµÄÖյ㣻Բ»¡½ØÈ¡ÖÁÍÖÔ²£¬SIZEÊôÐÔ¼´ÊÇÍêÕûÍÖÔ²µÄºáÖáºÍ×ÝÖá°ë¾¶£¬SweepDirectionÊôÐÔÖ¸Ã÷Ô²»¡ÊÇ˳ʱÕë·½Ïò»¹ÊÇÄæÊ±Õë·½Ïò£»Èç¹ûÍÖÔ²ÉϵÄÁ½¸öµãλÖò»¶Ô³Æ£¬ÄÇôÕâÁ½µã¼äµÄÔ²»¡¾Í»á·ÖΪ´ó»¡ºÍС»¡£¬IsLargeArcÊôÐÔÓÃÓÚÖ¸Ã÷ÊÇ·ñʹÓôó»¡È¥Á¬½Ó£»RotationAngleÊôÐÔÓÃÀ´Ö¸Ã÷Ô²»¡Ä¸ÍÖÔ²µÄÐýת½Ç¶È£¬ÈçÏÂͼËùʾÊǶԼ¸¸öÊôÐԵı仯×ö³öµÄÏêϸ¶Ô±È£º

BezierSegment(Èý´Î·½±´Èû¶ûÇúÏß)ÓÉ4¸öµã¾ö¶¨£º

£¨1£©Æðµã£º¼´Ç°Ò»¸öÏ߶εÄÖÕµã»òPathFigureµÄStartPoint¡£

£¨2£©Öյ㣺Point3ÊôÐÔ£¬¼´ÇúÏßµÄÖÕµãλÖá£

£¨3£©Á½¸ö¿ØÖƵ㣺Point1ºÍPoint2ÊôÐÔ¡£

³õÂÔµÄ˵£¬Èý´Î·½±´Èû¶ûÇúÏß¾ÍÊÇÓÉÆðµã³ö·¢×ßÏòPoint1·½Ïò£¬ÔÙ×ßÏòPoint2·½Ïò£¬×îºóµ½´ïÖÕµãµÄƽ»¬ÇúÏߣ¬¾ßÌåµÄËã·¨Çë²éÔÄά»ù°Ù¿Æ¡°±»Èû¶ûÇúÏß¡±´ÊÌõ¡£

ÈçÏ´úÂëÊÇXAML´úÂë±íʾµÄÈý´Î·½±´Èû¶ûÇúÏߣº

<Window x:Class="WpfApplication1.Window51"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window51" Height="300" Width="300">
<Grid>
<Path Stroke="Black" StrokeThickness="2">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="0,0">
<BezierSegment Point1="250,0" Point2="50,200" Point3="300,200">

</BezierSegment>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
</Window>

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

QuadraticBezierSegment£¨¶þ´Î·½±´Èû¶ûÇúÏߣ©ÓëBezierSegmentÀàËÆ£¬Ö»ÊÇ¿ØÖƵãÓÉÁ½¸ö±äΪÁËÒ»¸ö¡£Ò²¾ÍÊÇ˵QuadraticBezierSegmentÓÉ3¸öµã¾ö¶¨£º

£¨1£©Æðµã£º¼´Ç°Ò»¸öÏ߶εÄÖÕµã»òPathFigureµÄStartPoint¡£

£¨2£©Öյ㣺Point2ÊôÐÔ£¬¼´ÇúÏßµÄÖÕֹλÖá£

£¨3£©¿ØÖƵ㣺Point1ÊôÐÔ¡£

ÈçϵĴúÂë¾Í±íʾµÄÊǶþ´Î·½±´Èû¶ûÇúÏߣº

<Window x:Class="WpfApplication1.Window52"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window52" Height="339" Width="325">
<Grid>
<Path Stroke="Blue" StrokeThickness="2">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="0,300">
<QuadraticBezierSegment Point1="150,-150" Point2="300,300">

</QuadraticBezierSegment>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
</Window>

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

ÖÁ´Ë£¬¼òµ¥µÄ·¾¶¾Í½éÉÜÍêÁË¡£Èç¹ûÏë»æÖÆ³ö¸´ÔÓµÄͼÐÎÀ´£¬ÎÒÃÇÒª×öµÄ½ö½öÊÇÔÚPathFigure°ÑSegmentÒ»¶Î¶ÎµÄ¼ÓÉÏÈ¥¡£

GeometryGroupÒ²ÊÇGeometryµÄÒ»¸öÅÉÉúÀ࣬Ëü×î´óµÄÌØµãÊÇ¿ÉÒÔ½«Ò»×éPathGeometry×éºÏÔÚÒ»Æð£¬ÈçÏÂÃæµÄÀý×Ó£º

<Window x:Class="WpfApplication1.Window53"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window53" Height="300" Width="300">
<Grid>
<Path Stroke="Black" Fill="LightBlue" StrokeThickness="1">
<Path.Data>
<GeometryGroup>
<PathGeometry>
<PathFigure StartPoint="0,0">
<BezierSegment Point1="250,0" Point2="50,200" Point3="300,200"></BezierSegment>
</PathFigure>
</PathGeometry>
<PathGeometry>
<PathFigure StartPoint="0,0">
<BezierSegment Point1="230,0" Point2="50,200" Point3="300,200"></BezierSegment>
</PathFigure>
</PathGeometry>
<PathGeometry>
<PathFigure StartPoint="0,0">
<BezierSegment Point1="210,0" Point2="50,200" Point3="300,200"></BezierSegment>
</PathFigure>
</PathGeometry>
<PathGeometry>
<PathFigure StartPoint="0,0">
<BezierSegment Point1="190,0" Point2="50,200" Point3="300,200"></BezierSegment>
</PathFigure>
</PathGeometry>
<PathGeometry>
<PathFigure StartPoint="0,0">
<BezierSegment Point1="170,0" Point2="50,200" Point3="300,200"></BezierSegment>
</PathFigure>
</PathGeometry>
<PathGeometry>
<PathFigure StartPoint="0,0">
<BezierSegment Point1="150,0" Point2="50,200" Point3="300,200"></BezierSegment>
</PathFigure>
</PathGeometry>
<PathGeometry>
<PathFigure StartPoint="0,0">
<BezierSegment Point1="130,0" Point2="50,200" Point3="300,200"></BezierSegment>
</PathFigure>
</PathGeometry>
</GeometryGroup>
</Path.Data>
</Path>
</Grid>
</Window>

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

5 ·¾¶±ê¼ÇÓï·¨

PathÊÇÈç´ËÇ¿´ó£¬¿ÉÒÔÈÃÎÒÃÇËæÐÄËùÓûµÄ»æÖÆÍ¼ÐΣ¬È»¶øËüµÄÒ»´óȱµãÊDz»ÈݺöÊӵģ¬ÄǾÍÊÇÆä±êÇ©Óï·¨µÄ·±Ëö¡£Ò»°ãÇé¿öÏ£¬¸´ÔÓͼÐΣ¨Path£©ÊÇÓÉÊý10ÌõÏß¶ÎÁ¬½Ó¶ø³É£¬°´ÕÕ±êǩʽÓï·¨£¬Ã¿ÌõÏß¶ÎÊÇÒ»¸ö±êÇ©£¨Segment£©¡¢Ã¿¸ö±êǩռ¾ÝÒ»ÐУ¬Ò»¸öͼÐξÍÒªÕ¼¼¸Ê®ÐдúÂë¡£¶øÕâ½ö½öÊÇÒ»¸öͼÐΣ¬Òª×é³ÉÒ»¸öÍêÕûµÄͼ»­ÓÖÍùÍùÐèÒª10¼¸¸öͼÐÎ×éºÏÔÚÒ»Æð£¬ÓпÉÄÜÕ¼¾ÝÊý°ÙÐдúÂ룡ÐÒºÃÕâÖÖÊÂÇéûÓз¢Éú£¬ÒòΪÎÒÃÇ¿ÉÒÔ½èÖúר¹©WPF»æÍ¼Ê¹ÓõÄ·¾¶±ê¼ÇÓï·¨£¨Path MarkUp Syntax£©À´¼«´óµÄ¼ò»¯PathµÄÃèÊö¡£

·¾¶±ê¼ÇÓ﷨ʵ¼ÊÉϾÍÊǸ÷ÖÖÏ߶εļò¼Ç·¨£¬±ÈÈç<LineSegment point="150,5"/>¿ÉÒÔ¼òдΪ"L 150,5"£¬Õâ¸öL¾ÍÊÇ·¾¶±ê¼ÇÓï·¨ÖеÄÒ»¸ö»æÍ¼ÃüÁî¡£²»½öÈç´Ë£¬Â·¾¶±ê¼ÇÓï·¨»¹Ôö¼ÓÁËһЩ¸üʵÓõĻæÍ¼ÃüÁ±ÈÈçHÓÃÀ´»æÖÆË®Æ½Ïߣ¬¡°H 180¡±¾ÍÊÇÖ¸´Óµ±Ç°µã»­Ò»ÌõˮƽֱÏߣ¬ÖÕµãµÄºá×ø±êÊÇ180£¨Äã²»ÐèÒª¿¼ÂÇ×Ý×ø±ê£¬×Ý×ø±êºÍµ±Ç°µãÒ»Ö£©¡£ÀàËÆµÄ»¹ÓÐVÃüÁÓÃÀ´»­ÊúÖ±Ö±Ïß¡£

ʹÓ÷¾¶±ê¼ÇÓï·¨»æÍ¼Ò»°ã·ÖÈý²½£ºÒƶ¯ÖÁÆðµã---»æÍ¼----±ÕºÏͼÐΡ£ÕâÈý²½Ê¹ÓõÄÃüÁîÉÔÓÐÇø±ð¡£Òƶ¯µ½ÆðµãʹÓõÄÒÆ¶¯ÃüÁîM£¬»æÍ¼Ê¹ÓõÄÊÇ»æÍ¼ÃüÁ°üÀ¨£ºL,H,V,A,C,QµÈ£¬ÏÂÃæ»áÖðÒ»½éÉÜ£»Èç¹ûͼÐÎÊDZպϵģ¬ÐèҪʹÓñպÏÃüÁîZ£¬ÕâÑù×îºóÒ»ÌõÏ߶εÄÖÕµãÓëµÚÒ»ÌõÏß¶ÎµÄÆðµã¼ä¾Í»áÁ¬½ÓÉÏÒ»ÌõÖ±Ï߶Ρ£

·¾¶±ê¼ÇÓï·¨ÊDz»Çø·Ö´óСдµÄ£¬ËùÒÔAºÍa£¬HºÍhÊǵȼ۵ġ£ÔÚ·¾¶±ê¼ÇÓï·¨ÖÐʹÓÃÁ½¸öDoubleÀàÐ͵ÄÊýÖµÀ´±íʾһ¸öµã£¬µÚÒ»¸öÖµ±íʾµÄÊǺá×ø±ê£¨¼Ç×öX£©£¬µÚ¶þ¸öÖµ±íʾ×Ý×ø±ê£¨¼Ç×÷y£©£¬Á½¸öÊý×Ö¿ÉÒÔʹÓöººÅ·Ö¸î(x,y)ÓÖ¿ÉÒÔʹÓÿոñ·Ö¸î(x y)¡£ÓÉÓÚ·¾¶±ê¼ÇÓï·¨ÖÐʹÓõĿոñ×÷ΪÁ½¸öµãÖ®¼äµÄ·Ö¸î£¬ÎªÁ˱ÜÃâ»ìÏý£¬½¨ÒéʹÓöººÅ×÷Ϊµãºá×Ý×ø±êµÄ·Ö¸ô·û¡£

ÈçÏÂͼËùʾÊdz£ÓõÄ·¾¶±ê¼ÇÓï·¨µÄ×ܽ᣺

ÔÚÉÏÊöµÄÃüÁîÖУ¬SºÍTÁ½¸öÃüÁî±È½ÏÌØÊâ¡£SÓÃÓÚ»æÖÆÆ½»¬µÄÈü±´¶ûÇúÏߣ¬µ«Ö»ÐèÒª¸ø³öÒ»¸ö¿ØÖƵ㣬Õâ¸ö¿ØÖƵãÏ൱ÓÚÆÕͨÈü±´¶ûÇúÏߵĵڶþ¸ö¿ØÖƵ㣬֮ËùÒÔµÚÒ»¸ö¿ØÖƵãÊ¡ÂÔ²»Ð´ÊÇÒòΪƽ»¬Èý´Î·½Èü±´¶ûÇúÏß»á°ÑǰһÌõ±´Èû¶ûÇúÏߵĵڶþ¿Õ¿ØÖƵãÒÔÆðµãΪ¶Ô³ÆÖÐÐĵĶԳƵ㵱×÷µ±×÷×Ô¼ºµÄµÚÒ»¸ö¿ØÖƵ㣨Èç¹ûÇ°ÃæµÄÏ߶β»ÊDZ´Èû¶ûÇúÏߣ¬ÔòµÚÒ»¸ö¿ØÖƵãºÍÆðµãÏàͬ£©¡£ÀýÈ磬ÏÂÃæÁ½ÌõÇúÏßÊǵȼ۵ģº

<Path Stroke="Red" Data="M 0,0 C 30,0 70,100 100,100 S 170,0 200,0"></Path>  
<Path Stroke="Blue" Data="M 0,0 C 30,0 70,100 100,100 C 130,100 170,0 200,0"></Path>

ÓëSÏà·Â£¬TÃüÁîÓÃÓÚ»æÖÆÆ½»¬¶þ´Î±´Èû¶ûÇúÏߣ¬»æÖƵÄʱºòÈç¹ûÇ°ÃæÒ²ÊÇÒ»Ìõ¶þ´Î±´Èû¶ûÇúÏߵϰ£¬TÃüÁî»á°ÑÇ°ÃæµÄÕâ¶ÎÇúÏߵĿØÖƵãÒÔÆðµãΪ¶Ô³ÆÖÐÐĵĶԳƵ㵱×÷×Ô¼ºµÄ¿ØÖƵ㣨Èç¹ûÇ°ÃæµÄÏ߶β»ÊǶþ´Î±´Èû¶ûÇúÏßÔò¿ØÖƵãÓëÆðµãÏàͬ£©¡£ÏÂÃæÁ½ÌõÇúÏߵȼۣº

<Path Stroke="Red" Data="M 0,200 Q 100,0 200,200 T 400,200"></Path>  
<Path Stroke="Blue" Data="M 0,200 Q 100,0 200,200 Q 300,400 400,200"></Path>

ÏÖÔÚÎÒÃǾͿÉÒÔʹÓ÷¾¶±ê¼ÇÓï·¨À´»æÍ¼ÁË£¡Ê¹Ó÷½·¨ÊǰÉÕâÕâЩÃüÁî´®ÆðÀ´¡¢ÐγÉÒ»¸ö×Ö·û´®£¬È»ºó¸³Öµ¸øPathµÄDataÊôÐÔ¡£Ê¹ÓÃBlend»æÍ¼Ê±£¬Blend»á×Ô¶¯Ê¹Ó÷¾¶±ê¼ÇÓï·¨À´¼Ç¼Êý¾Ý¶ø²»ÊÇÊÇÓôúÂëÁ¿¾Þ´óµÄ±êǩʽÓï·¨¡£

6 ʹÓÃPath¼ôÇнçÃæÔªËØ

ʵ¼Ê¹¤×÷Öо­³£»áÓöµ½ÖÆ×÷²»¹æÔòµÄ´°Ìå»òÕ߿ؼþ£¬WPFÔÚÕâ·½Ãæ×öÁËÁ¼ºÃµÄÖ§³Ö£¬½öÐèʹ´°ÌåºÍ¿Ø¼þµÄClipÊôÐԾͿÉÒÔÇáËÉ×öµ½¡£

ClipÊôÐÔ±»¶¨ÒåÔÚUIEelmentÀàÖУ¬Òò´Ë£¬WPF´°ÌåµÄËùÓпؼþ¡¢Í¼Ðζ¼¾ßÓÐÕâ¸öÊôÐÔ¡£ClipÊôÐÔµÄÊý¾ÝÀàÐÍÊÇGeometry£¬ÓëPathµÄDataÊôÐÔÒ»Ö¡£Òò´Ë£¬ÎÒÃÇÖ»ÐèÒª°´ÕÕÐèÇóÖÆ×÷ºÃÌØÊâÐÎ×´µÄPath²¢°ÑPathµÄDataÊôÐÔÖµ¸³Öµ¸øÄ¿±ê´°Ìå¡¢¿Ø¼þ»òÕ߯äËüͼÐΣ¬¶ÔÄ¿±êµÄ¼ôÇоÍËãÍê³ÉÁË¡£Çë¿´ÏÂÃæÕâ¸ö²»¹æÔò´°ÌåµÄÀý×Ó¡£

<Window x:Class="WpfApplication1.Window56"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window56" Height="250" Width="300" WindowStyle="None" AllowsTransparency="True" WindowStartupLocation="CenterScreen" Background="Yellow">
<Grid VerticalAlignment="Center" HorizontalAlignment="Center">
<Path Stroke="Orange" Fill="Yellow" x:Name="clipPath0" Visibility="Hidden" Data="M 55,100 A 50,50 0 1 1 100,60 A 110,95 0 0 1 200,60 A 50,50 0 1 1 250,100 A 110,95 0 1 1 55,100 Z">
</Path>
<Button Content="Clip" Width="80" Height="25" Click="Button_Click" HorizontalAlignment="Center" VerticalAlignment="Center"></Button>
</Grid>
</Window>

Èç¹ûÏëÈÃÒ»¸ö´°Ìå¿ÉÒÔ±»²ÃÇУ¬ÄÇôÆäAllowsTransparency±ØÐëÒªÉèÖÃΪTrue£¬Õâ¸öÊôÐÔÉèΪTrueÖ®ºó£¬WindowStyle±ØÐëÒªÉèÖÃΪNone¡£
ButtonµÄʼþ´¦ÀíÆ÷ÖдúÂëÈçÏ£º

private void Button_Click(object sender, RoutedEventArgs e)  
{
this.Clip = clipPath0.Data;
}

ÔËÐгÌÐò£¬µ¥»÷°´Å¥£¬ÔËÐÐЧ¹ûÈçÏÂͼ£º

1.2 ͼÐεÄЧ¹ûºÍÂ˾µ

ÒÔÍù£¬³ÌÐòÔ±ÃǺÜÍ·ÌÛµÄÒ»¼þÊÂÇé¾ÍÊÇÒª¾«È·ÊµÏÖUIÉè¼ÆÊ¦ÃǸø³öµÄÑù¸å¡£ÓÐЩʱºò³ÌÐòÔ±¿ÉÒÔʹÓÃÉè¼ÆÊ¦ÌṩµÄͼƬ×÷Ϊ±³¾°»òÕßÌùͼ£¬µ«ÕâЩͼƬÍùÍù¶¼ÊÇλͼ¶ø·ÇʸÁ¿Í¼£¬ËùÒÔµ±Ó¦ÓÃÁËÕâЩͼƬµÄ´°Ìå»ò¿Ø¼þµÄ³ß´ç·¢Éú¸Ä±äʱ£¬Í¼Æ¬¾Í»á³öÏÖ¾â³Ý¡¢ÂíÈü¿Ë»òÊ§ÕæµÈÇé¿ö¡£¶ÔÓÚÄÇЩ¶ÔÓû§ÌåÑéÒªÇó±È½Ï¸ßµÄÈí¼þ³ÌÐòÔ±²»ÄÜÖ±½ÓʹÓÃλͼÁË£¬Ö»ÄÜÓôúÂëÀ´ÊµÏÖÉè¼ÆÊ¦µÄÉè¼Æ¡£ÒªÖªµÀ£¬Éè¼ÆÊ¦ÊÖÀïÓõÄÊÇPhotoShop£¬FireWorksÕâЩרҵµÄÉè¼Æ¹¤¾ß£¬¼Ó¸öÒõÓ°£¬Éú³É¸ö·¢¹âЧ¹û¾ÍÊǵãµãÊó±êµÄÊ£¬Í¬ÑùµÄЧ¹ûÈóÌÐòԱʹÓÃC#ʵÏÖ¾ÍûÓÐÄÇôÈÝÒ×ÁË£¬ÓеÄʱºòÉõÖÁÐèÒªÓõ½Ò»Ð©ÔÚÓÎÏ·ÀïÃæ²Å»áÓõ½µÄ¼¼ÊõºÍ֪ʶ£¬ÕâÎÞÒÉÔö¼ÓÁË¿ª·¢µÄÄѶȺͳɱ¾¡£

WPFµÄ³öÏÖÎÞÒÉÊdzÌÐòÔ±µÄ¸£Òô£¬ÒòΪ²»µ«ÏñÒõÓ°£¬·¢¹âЧ¹û¿ÉÒÔʹÓÃÒ»Á½¸öÊôÐÔÀ´ÊµÏÖ£¬¾ÍÁ¬Í¨µÀ¡¢¶¯Ì¬Ä£ºýÕâЩ¸ß¼¶µÄЧ¹ûÒ²¿ÉÒÔÇáËÉʵÏÖ¡£Í¬Ê±£¬Éè¼ÆÊ¦ºÍ³ÌÐòÔ±»¹¿ÉÒÔÏñΪPhotoShop¿ª·¢Â˾µÒ»ÑùΪWPF¿ª·¢Ð§¹ûÀà¿â£¬½ìʱֻÐèÒª°ÑÀà¿âÒýÈëµ½ÏîÄ¿ÖоͿÉÒÔʹÓÃÆäÖеÄЧ¹ûÁË£¨Î¢Èí¹Ù·½ÍøÕ¾ºÍһЩ¿ªÔ´ÍøÕ¾ÉÏÒѾ­ÓкܶàЧ¹ûÀà¿â¿É¹©Ê¹Óã©¡£

ÔÚUIElementÀàµÄ³ÉÔ±ÖÐÄã¿ÉÒÔÕÒµ½BitmapEffectºÍEffectÕâÁ½¸öÊôÐÔ£¬ÕâÁ½¸öÊôÐÔ¶¼ÊÇΪUIÔªËØÌí¼ÓЧ¹û¡£Äã¿ÉÄÜ»áÎÊ£ºÎª×öͬһ¼þÊÂ×¼±¸ÁËÁ½¸öÊôÐÔ£¬ÄѵÀ²»³åÍ»Â𣿴ð°¸ÊÇ£ºµÄÈ·³åÍ»¡£WPF×îÔçµÄ°æ±¾ÀïÃæÖ»ÓÐBitmapEffectÕâ¸öÊôÐÔ£¬Õâ¸öÊôÐÔʹÓÃCPUµÄÔËËãÄÜÁ¦ÎªUIÔªËØÌí¼ÓЧ¹û£¬ÕâÑù×öµÄÎÊÌâ¾ÍÊÇЧ¹ûÒ»¶à»òÕßÈôøÓÐЧ¹ûUIÔªËØ²ÎÓ붯»­£¬³ÌÐòµÄÐÔÄÜ»áÒòΪCPU×ÊÔ´±»´óÁ¿Õ¼Óöø´ó·ù½µµÍ£¨ÒªÃ´·´Ó¦±äÂý£¬ÒªÃ´Ë¢Ð»òÕß¶¯»­±äµÄºÜ¿¨£©¡£ËæºóµÄ°æ±¾ÖУ¬Î¢Èí¾ö¶¨×ªÓÃÏÔ¿¨GPUµÄÔËËãÄÜÁ¦ÎªUIÔªËØÌí¼ÓЧ¹û£¬ÓÚÊÇÌí¼ÓÁËEffectÕâ¸öÊôÐÔ¡£ÕâÑù¼´¼õÉÙÁ˶ÔCPUµÄÀË·ÑÓÖ½«Ó¦ÓóÌÐòµÄÊÓ¾õЧ¹ûÀ­Æ½µ½ÓëÓÎÏ·³ÌÐòÒ»¸ö¼¶±ð¡£

ÒòΪÓÐEffectÕâ¸öÊôÐÔÌæ»»BitmapEffect£¬ËùÒÔÄãÔÚMSDNÎĵµÀïÃæ¿´µ½BitmapEffect±»±ê¼ÇΪÒѹýʱ£¬²»¹ýÔÚWPF4.0ÖÐBitmapeffectÈÔÈ»¿ÉÒÔʹÓã¬Ò²¾ÍÊÇ˵δÀ´Á½ÈýÄêÀbitmapEffectÈÔÈ»¿ÉÒÔʹÓá£ÏÂÃæÈÃÎÒÃdz¢ÊÔÈçºÎʹÓÃÕâÁ½ÖÖЧ¹û£º

1.2.1 ¼òµ¥Ò×ÓõÄBitmapEffect

BitmapEffect¶¨ÒåÔÚUIElementÀàÖУ¬ËüµÄÊý¾ÝÀàÐÍÊÇBitmapEffectÀà¡£BitmapEffectÊÇÒ»¸ö³éÏóÀ࣬ËùÒÔÎÒÃÇÖ»ÄÜʹÓÃËüµÄÅÉÉúÀàÀ´ÎªUIElementµÄBitmapEffectÊôÐÔ¸³Öµ¡£BitmapEffectÀàµÄÅÉÉúÀಢ²»¶à£¬°üÀ¨ÒÔϼ¸¸ö£º

BevelBitmapEffect£ºÐ±½ÇЧ¹û¡£

BitmapEffectGroup£º¸´ºÏЧ¹û£¨¿ÉÒ԰Ѷà¸öBitmapEffect×éºÏÔÚÒ»Æð£©¡£

BlurBitmapEffect£ºÄ£ºýЧ¹û¡£

DropShadowBitmapEffect£ºÍ¶Ó°Ð§¹û¡£

EmbossBitmapEffect£º¸¡µñЧ¹û¡£

OuterGlowBitmapEffect£ºÍâ·¢¹âЧ¹û¡£

ÿ¸öЧ¹û¶¼ÓÐ×Ô¼ºµÄһϵÁÐÊôÐÔÀ´×öµ÷Õû£¬±ÈÈçÄã¿ÉÒÔµ÷ÕûͶӰЧ¹ûµÄͶӰ¸ß¶È£¬ÒõÓ°Éî¶ÈºÍ½Ç¶È£¬ÈÃÓû§¸Ð¾õ¹âÊÇÓÉij¸ö½Ç¶ÈͶÉäÏÂÀ´£»ÄãÒ²¿ÉÒÔµ÷ÕûÍâ·¢¹âЧ¹ûµÄÑÕÉ«ºÍÑÓÕ¹¾àÀë¡£ÏÂÃæÒ»¸öDropShadowBitmapEffectµÄ¼òµ¥Àý×Ó£º

<Window x:Class="WpfApplication1.Window57"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window57" Height="300" Width="300">
<Grid>
<Button Width="80" Height="50">
<Button.BitmapEffect>
<DropShadowBitmapEffect Direction="-45" Opacity="0.75" Color="Red" ShadowDepth="7"></DropShadowBitmapEffect>
</Button.BitmapEffect>
</Button>
</Grid>
</Window>

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

¶ÔÓÚÿ¸öBitmapEffectµÄÅÉÉúÀàMSDN¶¼ÓÐÏ൱ÏêϸµÄ¼ÇÊö£¬Çë´ó¼Ò×ÔÐвéÔÄ¡£

1.2.2 ·á¸»¶à²ÊµÄEffect

»æÍ¼Èí¼þPhotoshopÄܹ»´ó»ñȫʤµÄÒ»¸öÖØÒªÒòËØ¾ÍÊÇËüµÄ²å¼þ±ê×¼Êǹ«¿ªµÄ£¬ÕâÑù£¬ÖÚ¶àµÄµÚÈý·½¹«Ë¾ºÍÈËÔ±¾Í¿ÉÒÔΪËüÉè¼Æ¸÷ÖÖ¸÷ÑùµÄ²å¼þ¡¢¼«´óµÄ·á¸»ËüµÄ¹¦ÄÜ----ÖÚÈËʰ²ñ»ðÑæ¸ß¡£ÔÚÖÚ¶àµÄPhotoshop²å¼þÖУ¬×îÖØÒªµÄÒ»Àà¾ÍÊÇÂ˾µ£¬»òÕß˵ÊÇͼƬµÄЧ¹û¡£±ÈÈç˵ÎÒÒª°ÑÒ»ÕÅÍ¼Æ¬ÖÆ×÷³ÉÀÏÕÕÆ¬µÄЧ¹û£¬ÔÚûÓÐÂ˾µµÄÇé¿öÏ£¬¾ÍÐèÒªÊÖ¹¤µ÷ÕûºÜ¶àͼƬÊôÐÔ²ÅÄÜ×öµ½£¬¶øÊ¹ÓÃÂ˾µ£¬ÔòÖ»ÐèÒª°ÑÂ˾µ¼ÓÔÚͼƬÉϼ´¿É¡£ÏÔȻʹÓÃÂ˾µÐ§¹û¿ÉÒÔ»ñµÃÈçϺô¦£º

Ìá¸ß¹¤×÷ЧÂÊ¡£

µÃµ½¸üרҵµÄЧ¹û¡£

¶ÔʹÓÃÕߵļ¼ÊõˮƽҪÇóÏà¶Ô½ÏµÍ¡£

WPFÖÐÒý½øÁËÕâÖÖÂ˾µ²å¼þµÄ˼Ï룬Æä³É¹¦¾ÍÊÇUIElementÀàµÄEffectÊôÐÔ¡£EffectÊôÐÔµÄÀàÐÍÊÇEffectÀ࣬EffectÊdzéÏóÀ࣬Ҳ¾ÍÊÇ˵UIElementµÄEffectÊôÐÔ¿ÉÒÔ½ÓÊÕEffectÀàµÄÈκÎÒ»¸öÅÉÉúÀàʵÀý×÷Ϊ×Ô¼ºµÄÖµ¡£EffectÀàλÓÚSystem.Windows.Media.EffectsÃû³Æ¿Õ¼äÖУ¬ËüµÄÅÉÉúÀàÓÐ3¸ö£¬·Ö±ðÊÇ£º

BlurEffect£ºÄ£ºýЧ¹û¡£

DropShadowEffect£ºÍ¶Ó°Ð§¹û¡£

ShaderEffect£º×ÅÉ«Æ÷Ч¹û£¨³éÏóÀࣩ¡£

Äã¿ÉÄÜ»áÏë----Ç¿´óµÄEffectÅÉÉúÀàÔõô»¹Ã»ÓÐÒѾ­·ÏÆúµÄBitmapEffectÀà¶àÄØ£¿´ð°¸ÊÇÕâÑùµÄ£ºÒòΪģºýºÍͶӰÔÚ±à³ÌÖÐʹÓõÄ×î¶à£¬ËùÒÔ.NET FramworkÄÚ½¨ÁËÕâÁ½¸öЧ¹û¡£ÕâÁ½¸öЧ¹ûʹÓÃÆðÀ´·Ç³£·½±ã£¬¶øÇÒÇë×¢Ò⣬ÕâÁ½¸öЧ¹ûÊÇʹÓÃGPU½øÐÐäÖȾ£¬¶ø²»ÏñBitmapEffectÄÇÑùʹÓÃCPUäÖȾ¡£ShaderEffectÈÔÈ»ÊǸö³éÏóÀ࣬Ëü¾ÍÊÇÁ÷¸øÂ˾µ¿ª·¢ÈËÔ±µÄ½Ó¿Ú¡£Ö»ÒªÄ㿪·¢ÅÉÉú×ÔShaderEffectµÄЧ¹ûÀ࣬±ðÈ˾ͿÉÒÔÖ±½ÓÄÃÀ´Óá£
¿ª·¢×ÅÉ«Æ÷Ч¹ûÐèҪʹÓÃPixel ShaderÓïÑÔ£¨¼òдºÍPhotoshopÒ»Ñù£¬Ò²ÊÇPS£©ºÍһЩDirectX֪ʶ£¬³¬³öÁ˱¾ÊéµÄ·¶Î§¡£¸ÐÐËȤµÄ¶ÁÕß¿ÉÒÔÔÚ΢ÈíµÄ¹ÙÍøÉÏÕÒµ½ËüµÄSDKºÍ¿ª·¢Îĵµ¡£

¶ÔÓÚ´ó¶àÊýWPF¿ª·¢ÈËÔ±À´Ëµ£¬ÎÒÃÇÐèÒªµÄÊÇÏֳɵÄÂ˾µÐ§¹û£¬ËùÒÔ¹Ù·½µÄÂ˾µ°ü¿ÉÒÔ´ÔÕâÀïÏÂÔØ£ºhttp://wpffx.codeplex.com¡£½âѹÏÂÔØµÄZIPÎļþ£¬¿ÉÒÔ¿´µ½·Ö±ðΪWPFºÍSilveright×¼±¸µÄÁ½Ì×Â˾µ¡£½øÈëWPFÎļþ¼Ð£¬ShaderEffectLibraryÎļþ¼ÐÀïµÄÏîÄ¿¾ÍÊÇЧ¹û¿â¡£Ð§¹û¿âµÄʹÓ÷½·¨ÈçÏ£º

Ê×Ïȵ½http://wpf.codeplex.com/releases/view/14962ÏÂÔØShader Effect BuildTask And Templates.zip¡£½âѹZIPÎļþÖ®ºó°´ÕÕÆäÖеÄReadmeÎĵµ½øÐа²×°£¬ÅäÖá£ÕâÊÇ×ÅÉ«Æ÷Ч¹ûµÄ±àÒë/¿ª·¢»·¾³£¬Ã»ÓÐËü£¬×ÅÉ«Æ÷Ч¹ûÏîÄ¿½«²»Äܱ»±àÒë¡£Èç¹ûÄãÏ뿪·¢×Ô¼ºµÄЧ¹ûÂ˾µ£¬Ò²±ØÐë°²×°Õâ¸ö»·¾³¡£¼ìÑé°²×°ÊÇ·ñ³É¹¦µÄ·½·¨ÊÇÆô¶¯VS£¬²é¿´ÊÇ·ñ¿ÉÒÔн¨WPF Shader Effect LibraryÏîÄ¿£¬ÈçÏÂͼËùʾ£º

н¨Ò»¸öWPF½â¾ö·½°¸£¬°ÑShaderEffectLibraryÖеÄÏîÄ¿Ìí¼Ó½øÀ´£¬²¢ÎªWPFÏîÄ¿Ìí¼Ó¶ÔWPFShaderEffectLibraryÏîÄ¿µÄÒýÓã¬Äã¾Í¿ÉÒÔʹÓÃЧ¹û¿âÀïÃæµÄЧ¹ûÁË¡£

ʹÓÃÂ˾µ¿â£¬Ö»ÐèÒªÉèÖü¸¸öÊôÐÔ£¬²ã´Î·ÖÃ÷¡¢¶¯¸ÐÊ®×ãµÄͼƬЧ¹û¾Í³öÀ´ÁË£¡ÕâÑùµÄ¹¤×÷¼´¿ÉÒÔÓÉÉè¼ÆÊ¦À´Íê³É£¬Ò²¿ÉÒÔÓɳÌÐòÔ±À´Íê³É¡£Èç¹û¶ÔЧ¹û²»ÂúÒ⣬ֱ½ÓÔÚXAMLÎļþÀïÃæÐ޸IJ¢±£´æ¾Í¿ÉÒÔÁË£¬¶ø²»±ØÔÙÏñ֮ǰÄÇÑùÔÙÓÃPhotoshopµÈ¹¤¾ß½øÐзµ¹¤¡£Í¬Ê±£¬Í¬Ò»ÕÅԭͼƬ¿ÉÒÔ¼ÓÔØÎª²»Í¬µÄЧ¹û£¬Ò²²»±ØÏñ֮ǰһÑùÏÈÓÉÉè¼ÆÊ¦ÖÆ×÷³ö¶àÕÅͼƬÔÙÌí¼Ó½øÓ¦ÓóÌÐò£¬ÕâÑù£¬³ÌÐòµÄ±àÒë½á¹ûÒ²»áСºÜ¶à¡£

1.3 ͼÐεıäÐÎ

µ±ÎÒÃÇ¿´µ½¡°±äÐΡ±Õâ¸ö´Êʱ£¬Ê×ÏÈ»áÏëÆðʲô£¿À­³¤¡¢¼·±â£¿·Å´ó¡¢ËõС£¿»¹ÊÇ... ±äÐνð¸Õ£¿ÆäʵWPFÖеġ°±äÐΡ°µÄº¬ÒåºÜ¹ã£¬³ß´ç¡¢Î»Öá¢×ø±êϵ±ÈÀý¡¢Ðýת½Ç¶ÈµÈµÄ±ä»¯¶¼Ëã±äÐΡ£

WPFÖеıäÐÎÊǺÍUIÔªËØ·Ö¿ªµÄ¡£¾Ù¸öÀý×Ó£¬Äã¿ÉÒÔÉè¼ÆÒ»¸ö¡±Ïò×óÐýת45¶È¡°µÄ±äÐΣ¬È»ºó°ÑÕâ¸ö±äÐθ³Öµ¸ø²»Í¬µÄUIÔªËØµÄ±äÐοØÖÆÊôÐÔ£¬ÕâЩUIÔªËØ¶¼»áÏò×óÐýת45¶ÈÁË¡£ÕâÖÖ½«ÔªËغͱäÐοØÖÆÊôÐÔ·Ö¿ªµÄÉè¼Æ·½°¸¼´¼õÉÙÁËΪUIElementÀàÌí¼Ó¹ý¶àµÄÊôÐÔ£¬ÓÖÌá¸ßÁ˱äÐÎÀàʵÀýµÄ¸´ÓÃÐÔ£¬¿Éνһ¾ÙÁ½µÃ¡£ÕâÖÖÉè¼ÆÄ£Ê½·Ç³£·ûºÏ²ßÂÔģʽÖеġ±ÓÐÒ»¸ö¡°±È¡±ÊÇÒ»¸ö¡°¸ü¼ÓÁé»îµÄ˼Ïë¡£

¿ØÖƱàдµÄÊôÐÔÓÐÁ½¸ö£¬·Ö±ðÊÇ£º

RenderTransform£º³ÊÏÖ±äÐΣ¬¶¨ÒåÔÚUIElementÀàÖС£

LayoutTransform£º²¼¾Ö±äÐΣ¬¶¨ÒåÔÚFramworkElementÀàÖС£

ÒòΪFramworkElmentÀàÅÉÉú×ÔUIElementÀ࣬¶ø¿Ø¼þµÄ»ùÀàControlÀàÓÖÅÉÉú×ÔFramworkElmentÀàÖУ¬ËùÒÔÔڿؼþ¼¶±ð£¬ÄãÁ½¸öÊôÐÔ¶¼¿ÉÒÔ¿´µ½¡£ÕâÁ½¸öÊôÐÔ¶¼ÊÇÒÀÀµÊôÐÔ£¬ËüÃǵÄÊý¾ÝÀàÐͶ¼ÊÇTransform³éÏóÀ࣬Ҳ¾ÍÊÇ˵£¬TransformÀàµÄÅÉÉúÀà¾ù¿ÉΪÕâÁ½¸öÊôÐÔ¸³Öµ¡£

Transform³éÏóÀàµÄÅÉÉúÀàÓÐÈçÏÂһЩ£º

MatrixTransform£º¾ØÕó±äÐΣ¬°ÑÈÝÄɱ»±äÐÎUIÔªËØµÄ¾ØÐζ¥µã¿´×öÊÇÒ»¸ö¾ØÐνøÐбäÐΡ£

RotateTransform£ºÐýת±äÐΣ¬ÒÔ¸ø¶¨µÄµãΪÐýתÖÐÐÄ£¬ÒԽǶÈΪµ¥Î»½øÐÐÐýת±äÐΡ£

ScaleTransform£º×ø±êϵ±äÐΣ¬µ÷Õû±»±äÐÎÔªËØµÄ×ø±êϵ£¬¿É²úÉúËõ·ÅЧ¹û¡£

SkewTransform£ºÀ­Éì±äÐΣ¬¿ÉÔÚºáÏòºÍ×ÝÏòÉ϶Ա»±äÐÎÔªËØ½øÐÐÀ­Éì¡£

TranslateTransform£ºÆ«ÒƱäÐΣ¬Ê¹±»±äÐÎÔªËØÔÚºáÏò»òÕß×ÝÏòÉÏÆ«ÒÆÒ»¸ö¸ø¶¨µÄÖµ¡£

TransformGroup£º±äÐÎ×飬¿ÉÒ԰Ѷà¸ö¶ÀÁ¢µÄ±äÐκϳÉΪһ¸ö±äÐÎ×é¡¢²úÉú¸´ºÏ±äÐÎЧ¹û¡£

1.3.1 ³ÊÏÖ±äÐÎ

ʲôÊdzÊÏÖÄØ£¿ÏàÐÅ´ó¼Ò¶¼¼û¹ýº£ÊÐò×Â¥°É£¡Ô¶Ô¶ÍûÈ¥£¬Ô¶·½µÄÌì¿ÕÖÐÆ¯¸¡×ÅÒ»×ù³ÇÊУ¬¶øÊµ¼ÊÉÏÄÇÀïûÓгÇÊУ¬ÓеÄÖ»ÊÇɳĮºÍº£Ñó... ...£¬º£ÊÐò×Â¥ÐγɵÄÔ­ÒòÊÇÃܶȲ»¾ùµÄ¿ÕÆøÊ¹¹âÏß²úÉúÕÛÉ䣬×îÖÕÈÃÈË¿´µ½³ÇÊеÄÓ°Ïñ³ÊÏÖÔÚ±¾²»Ó¦¸Ã³öÏÖµÄλÖÃÉÏ---Õâ¾ÍÊdzÇÊÐÓ°ÏñµÄ³ÊÏÖ³öÏÖÁ˱äÐΡ£WPFµÄRederTransformÊôÐÔ¾ÍÊÇÒªÆðµ½Õâ¸ö×÷Óã¬ÈÃUIÔªËØ³ÊÏÖ³öÀ´µÄÊôÐÔÓëËü±¾À´µÄÊôÐÔ²»Ò»Ñù£¡±ÈÈ磬һ¸ö°´Å¥±¾À´´¦ÓÚCanvas»òÕßGridµÄ×óÉϽǣ¬¶øÎÒ¿ÉÒÔʹÓÃRenderTransformÈÃËü³ÊÏÖÔÚÓÒϽDz¢ÇÒÐýת45¡ã¡£

¹Û²ìÏÂÃæÕâ¸öÀý×Ó£º

<Window x:Class="WpfApplication1.Window59"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window59" Height="334" Width="485">
<Grid Margin="10" Background="AliceBlue">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto">

</ColumnDefinition>
<ColumnDefinition Width="*">

</ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto">

</RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Button Width="80" Height="80" Content="OK">
<Button.RenderTransform>
<!--¸´ºÏ±äÐÎ-->
<TransformGroup>
<!--Ðýת±äÐÎ-->
<RotateTransform CenterX="40" CenterY="40" Angle="45"></RotateTransform>
<!--Æ«ÒÆ±äÐÎ-->
<TranslateTransform X="300" Y="150"></TranslateTransform>
</TransformGroup>
</Button.RenderTransform>
</Button>
</Grid>
</Window>

ÔÚ²¼¾ÖGridÀ²¼¾Ö·ÖΪÁ½ÐÐÁ½ÁУ¬²¢ÇÒµÚÒ»ÐÐÐиߣ¬µÚÒ»ÁÐÁÐ¿í¶¼ÊÇÓÉButtonÀ´¾ö¶¨µÄ¡£Í¬Ê±£¬ÎÒΪButtonµÄRenderTransformÉèÖÃÁËÒ»¸ö¸´ºÏ±äÐΣ¬Ê¹ÓÃTransform½«Ò»¸öÆ«ÒÆ±äÐκÍÒ»¸öÐýת±äÐÎ×éºÏÔÚÁËÒ»Æð¡£Æ«ÒƱäÐν«ButtonµÄ³ÊÏÖ£¨¶ø²»ÊÇButton±¾Éí£©ÏòÓÒÒÆ¶¯300ÏñËØ£¬ÏòÏÂÒÆ¶¯150ÏñËØ£»Ðýת±äÐν«ButtonµÄ³ÊÏÖÏòÓÒÐýת45¡ã¡£ÔÚ´°ÌåµÄÉè¼ÆÆ÷ÀïÃæ£¬ÎÒÃÇ¿ÉÒÔÇåÎúµÄ¿´µ½ButtonµÄλÖò¢Ã»Óиı䣨µÚÒ»Ðк͵ÚÒ»Áв¢Ã»Óб仯£©£¬µ«ButtonÈ´³öÏÖÔÚÁËÓÒÏÂ(300,150)µÄλÖ㬲¢ÏòÓÒÐýתÁË45¡ã¡£ÈçÏÂͼËùʾ£º

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

Óû§²¢²»Äܾõ²ìµ½¾¿¾¹Êǿؼþ±¾ÉíµÄλÖᢽǶȷ¢ÉúÁ˱仯£¬»¹ÊdzÊÏÖµÄλÖ÷¢ÉúÁ˱仯¡£

ΪʲôÐèÒª³ÊÏÖ±äÐÎÄØ£¿´ð°¸ÊÇ£ºÎªÁËЧÂÊ£¡ÔÚ´°ÌåÉÏÒÆ¶¯UIÔªËØ±¾Éí»áµ¼Ö´°Ìå²¼¾ÖµÄ¸Ä±ä£¬¶ø´°ÌåµÄ²¼¾ÖµÄÿһ¸ö£¨ÄÄÅÂÊÇϸ΢µÄ£©±ä»¯¶¼½«µ¼ÖÂËùÓеĴ°ÌåÔªËØµÄ³ß´ç²âË㺯Êý£¬Î»ÖòâË㺯Êý¡¢³ÊÏÖº¯ÊýµÈµÄµ÷Óã¬Ôì³Éϵͳ×ÊÔ´Õ¼Óü¤Ôö¡¢³ÌÐòÐÔÄܶ¸½µ¡£¶øÊ¹ÓóÊÏÖ±äÐÎÔò²»»áÓöµ½ÕâÑùµÄÎÊÌ⣬³ÊÏÖ±äÐÎÖµ¸Ä±äÔªËØÏÔʾÔÚÄÄÀËùÒÔ²»Ç£³¶²¼¾ÖµÄ±ä»¯¡¢Ö»Éæ¼°´°ÌåµÄÖØ»æ¡£ËùÒÔ£¬µ±ÄãÐèÒªÖÆ×÷¶¯»­µÄʱºò£¬ÇëÇмÇҪʹÓÃRenderTransform¡£

1.3.2 ²¼¾Ö±äÐÎ

Óë³ÊÏÖ±äÐβ»Í¬£¬²¼¾Ö±äÐλáÓ°Ïì´°ÌåµÄ²¼¾Ö¡¢µ¼Ö´°Ìå²¼¾ÖµÄÖØÐ²âËã¡£ÒòΪ´°Ìå²¼¾ÖµÄÖØÐ²âËãºÍ»æÖÆ»áÓ°Ïì³ÌÐòµÄÐÔÄÜ£¬ËùÒÔ²¼¾Ö±äÐÎÒ»°ãÖ»ÓÃÔÚ¾²Ì¬±äÐÎÉÏ£¬¶ø²»ÓÃÓÚ»æÖƶ¯»­¡£

¿¼ÂÇÕâÑùÒ»¸öÐèÇó£ºÖÆ×÷Ò»¸öÎÄ×Ö×ÝÏòÅÅÁеÄdzÀ¶É«±êÌâÀ¸¡£Èç¹ûÎÒÃÇʹÓóÊÏÖ±äÐΣ¬´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window60"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window60" Height="338" Width="471">
<Grid x:Name="titleBar" Background="LightBlue">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock FontSize="24" Text="Hello Transformer" VerticalAlignment="Bottom" HorizontalAlignment="Center">
<TextBlock.RenderTransform>
<RotateTransform Angle="-90"></RotateTransform>
</TextBlock.RenderTransform>
</TextBlock>
</Grid>
</Window>

Éè¼ÆÆ÷ÖеÄЧ¹ûÈçÏ£º

¾¡¹ÜÎÒÃÇÈÃÏÔʾÎÄ×ÖµÄTextBlock¡°¿´ÆðÀ´¡±ÐýתÁË90¡ã£¬µ«TextBlock±¾Éí²¢Ã»Óб仯£¬¸Ä±äµÄÖ»ÊÇËüµÄÏÔʾ£¬ËùÒÔ£¬ËüµÄ¿í¶ÈÈÔÈ»Êǰɿí¶ÈÉèΪAutoµÄµÚÒ»ÁÐ³ÅµÄºÜ¿í¡£ÏÔÈ»Õâ²»ÊÇÎÒÃÇÏ£Íû¿´µ½µÄ¡£

·ÖÎöÐèÇó£¬ÎÒÃÇʵ¼ÊÐèÒªµÄÊǾ²Ì¬¸Ä±äTextBlockµÄ²¼¾Ö£¬Òò´ËÓ¦¸ÃʹÓÃLayoutTransform¡£½öÐèÒª¶ÔÉÏÃæµÄ´úÂë½øÐÐÒ»´¦¸Ä¶¯£º

<Window x:Class="WpfApplication1.Window60"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window60" Height="338" Width="471">
<Grid x:Name="titleBar" Background="LightBlue">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock FontSize="24" Text="Hello Transformer" VerticalAlignment="Bottom" HorizontalAlignment="Center">
<TextBlock.LayoutTransform>
<RotateTransform Angle="-90"></RotateTransform>
</TextBlock.LayoutTransform>
</TextBlock>
</Grid>
</Window>

Éè¼ÆÆ÷ÖеÄЧ¹ûÈçͼËùʾ£º

1.4 ¶¯»­

ºÎΪ¶¯»­£¿¶¯»­×ÔÈ»¾ÍÊÇ¡°»á¶¯µÄ»­¡±¡£Ëùν¡°»á¶¯¡±²»¹âָλÖûáÒÆ¶¯£¬»¹°üÀ¨½Ç¶ÈµÄÐýת¡¢ÑÕÉ«µÄ±ä»¯¡¢Í¸Ã÷¶ÈµÄÔö¼õµÈ¡£Ï¸ÐĵĶÁÕßÒѾ­·¢ÏÖ£¬¶¯»­±¾ÖʾÍÊÇÔÚÒ»¸öʱ¼ä¶ÎÀï¶ÔÏóλÖᢽǶȡ¢ÑÕÉ«¡¢Í¸Ã÷¶ÈµÈÊôÐÔÖµµÄÁ¬Ðø±ä»¯¡£ÕâЩÊôÐÔÖУ¬ÓÐЩÊǶÔÏó×ÔÉíµÄÊôÐÔ£¬ÓÐЩÔòÊÇÉÏÒ»½ÚËùѧµÄͼÐαäÐεÄÊôÐÔ¡£ÓÐÒ»µãÐèҪעÒ⣬WPF¹æ¶¨£¬¿ÉÒÔÓÃÀ´ÖÆ×÷¶¯»­µÄÊôÐÔ±ØÐëÊÇÒÀÀµÊôÐÔ¡£

±ä»¯¼´ÊÇÔ˶¯¡£¡°Ã»ÓÐÍÑÀëÔ˶¯µÄÎïÌ壬ҲûÓÐÍÑÀëÎïÌåµÄÔ˶¯¡±£¬Î¨ÎïÖ÷ÒåÈçÊÇ˵¡£WPFµÄ¶¯»­Ò²ÊÇÒ»ÖÖÔ˶¯£¬ÕâÖÖÔ˶¯µÄÖ÷Ìå¾ÍÊǸ÷ÖÖUIÔªËØ£¬ÕâÖÖÔ˶¯±¾Éí¾ÍÊÇÊ©¼ÓÔÚUI¿Ø¼þÉϵÄһЩTimerlineÅÉÉúÀàµÄʵÀý¡£ÔÚʵ¼Ê¹¤×÷ÖУ¬ÎÒÃÇÒª×öµÄÊÂÇéÍùÍù¾ÍÊÇÏÈÉè¼ÆºÃÒ»¸ö¶¯»­¹¹Ë¼¡¢ÓÃÒ»¸öTimerlineÅÉÉúÀàµÄʵÀý¼ÓÒÔ±í´ï£¬×îºóÈÃij¸öUIÔªËØÀ´Ö´ÐÐÕâ¸ö¶¯»­¡¢Íê³É¶¯»­Ó붯»­Ö÷ÌåµÄ½áºÏ¡£

¼òµ¥µÄ¶¯»­ÓÃÒ»¸öÔªËØÀ´Íê³É¾Í¿ÉÒÔÁË£¬¾ÍÏñÒ»¸öÑÝÔ±µÄ¶À½ÇÏ·£¬WPF°Ñ¼òµ¥¶¯»­³ÆÎªAnimationTimeline¡£¸´Ôӵ썼´²¢Ðе쬏´ºÏµÄ£©¶¯»­¾ÍÐèÒªUIÉ϶à¸öÔªËØÐ­Í¬Íê³É£¬¾ÍÏñµçÓ°ÖеÄÒ»¶Î³¡¾°¡£¸´ÔÓ¶¯»­µÄЭͬ°üÀ¨ÓÐÄÄЩUIÔªËØ²ÎÓ붯»­¡¢Ã¿¸öÔªËØµÄ¶¯»­ÐÐΪÊÇʲô¡¢¶¯»­ºÎʱ¿ªÊ¼ºÎʱ½áÊøµÈ¡£WPF°ÑÒ»×éЭͬµÄ¶¯»­Ò²³Æ×öStoryboard¡£

Timeline¡¢AnimationTimeline¡¢StoryboardµÄ¹ØÏµÈçÏÂͼËùʾ£º

±¾½Ú·ÖÁ½²¿·Ö£¬ÏÈÑо¿ÁËÈçºÎÉè¼Æ¼òµ¥¶ÀÁ¢µÄ¶¯»­£¬ÔÙÑо¿ÈçºÎ°Ñ¼òµ¥µÄ¶¯»­×éºÏÔÚÒ»ÆðÐγɳ¡¾°¡£

1.4.1 ¼òµ¥¶ÀÁ¢¶¯»­

Ç°ÃæËµ¹ý£¬¶¯»­¾ÍÊÇ¡°»á¶¯µÄ»­¡±£¬¶øÕâ¸ö»á¶¯Ö¸µÄÊÇÄܹ»ÈÃUIÔªËØ±äÐεÄij¸öÊôÐÔÖµ²úÉúÁËÁ¬ÐøµÄ±ä»¯¡£ÈκÎÒ»¸öÊôÐÔ¶¼ÓÐ×Ô¼ºµÄÊý¾ÝÀàÐÍ£¬±ÈÈçUIElementµÄWidthºÍHeightÊôÐÔΪDoubleÀàÐÍ£¬WindowµÄTitleÊôÐÔΪstringÀàÐÍ¡£¼¸ºõÕë¶Ôÿ¸ö¿ÉÄܵÄÊý¾ÝÀàÐÍ£¬WPFµÄ¶¯»­×Óϵͳ¶¼ÎªÆä×¼±¸ÁËÏàÓ¦µÄ¶¯»­À࣬ÕâЩ¶¯»­Àà¾ùÅÉÉú×ÔAnimationTimeline¡£ËüÃǰüÀ¨£º

ÉÏÃæÁгöµÄÕâЩÀà¶¼´øÓÐBaseºó׺£¬ËµÃ÷ËüÃǶ¼ÊdzéÏó»ùÀà¡£ÍêÕûµÄÇé¿öÏ£¬ÕâЩ³éÏóµÄ»ùÀàÓÖÄÜÅÉÉú³öÈýÖÖ¶¯»­£¬¼´¼òµ¥¶¯»­¡¢¹Ø¼üÖ¡¶¯»­¡¢ÑØÂ·¾¶Ô˶¯µÄ¶¯»­¡£ÀýÈçDoubleAnimationBase£¬ËüÍêÕûµÄÅÉÉú³öÁË3¸ö¾ßÌåµÄ¶¯»­£¬ÈçÏÂͼËùʾ£º

¶øÕë¶ÔIntÀàÐ͵ÄInt32AnimationBaseÖ»ÅÉÉú³öÁËInt32AnimationºÍInt32AnimationUsingKeyFramesÁ½¸ö¾ßÌåµÄ¶¯»­Àà¡£BooleanAnimationBaseºÍCharAnimationBaseµÄÅÉÉúÀàÔò¸üÉÙ£¬Ö»ÓйؼüÖ¡¶¯»­Àà¡£

ÒòΪWPF¶¯»­ÏµÍ³ÖÐDoubleÀàÐÍÊôÐÔÓõÄ×î¶à£¬¶øÇÒDoubleAnimationBaseµÄÅÉÉúÀàÒ²×îÍêÕû£¬ËùÒÔ±¾½ÚÖ»½²ÊöDoubleAnimationBaseµÄÅÉÉúÀࡣѧϰÍêÕâ¸öÀ࣬ÆäËüµÄ¶¯»­ÀàÐÍÒà¿É´¥ÀàÅÔͨ¡£

1£¬¼òµ¥µÄÏßÐÔ¶¯»­

Ëùν¼òµ¥µÄÏßÐÔ¶¯»­£¬¾ÍÊÇÖ¸½öÓб仯Æðµã¡¢±ä»¯Öյ㡢±ä»¯·ù¶È¡¢±ä»¯Ê±¼ä4¸öÒªËØ¹¹³ÉµÄ¶¯»­¡£

±ä»¯Ê±¼ä£¨DurationÊôÐÔ£©£º±ØÐëÖ¸¶¨£¬Êý¾ÝÀàÐÍÊÇDuration¡£

±ä»¯ÖÕµã(ToÊôÐÔ)£ºÈç¹ûûÓÐÖ¸¶¨±ä»¯Öյ㣬³ÌÐò½«²ÉÓÃÉÏÒ»´ÎµÄ¶¯»­µÄÖÕµã»òĬÈÏÖµ¡£

±ä»¯Æðµã(FromÊôÐÔ)£ºÈç¹ûûÓÐÖ¸¶¨±ä»¯µÄÆðµãÔòÒԱ仯Ŀ±êÊôÐԵĵ±Ç°ÖµÎªÆðµã¡£

±ä»¯·ù¶È(ByÊôÐÔ)£ºÈç¹ûͬʱָ¶¨Á˱仯Öյ㣬±ä»¯·ù¶È½«±»ºöÂÔ¡£

ÈÃÎÒÃÇ·ÖÎöÒ»¸öÀý×Ó£¬¼òµ¥µÄXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window61"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window61" Height="372" Width="475">
<Grid>
<Button Width="80" Height="80" HorizontalAlignment="Left" VerticalAlignment="Top">
<Button.RenderTransform>
<TranslateTransform X="0" Y="0" x:Name="tt"></TranslateTransform>
</Button.RenderTransform>
</Button>
</Grid>
</Window>

Óû§½çÃæÉÏÖ»°üº¬ÁËÒ»¸öButton£¬Õâ¸öButtonµÄRederTransformÊôÐÔÖµÊÇÒ»¸öÃûΪttµÄTranslateTransform¶ÔÏ󣬸ıäÕâ¸ö¶ÔÏóµÄX,YÖµ¾Í»áÈÃButtonµÄÏÔʾλÖ㨶ø²»ÊÇÏÖÔÚµÄÕæÊµÎ»Ö㩱仯¡£ButtonµÄClickʼþ´¦ÀíÆ÷´úÂëÈçÏ£º

private void Button_Click(object sender, RoutedEventArgs e)  
{
DoubleAnimation dax = new DoubleAnimation();
DoubleAnimation day = new DoubleAnimation();
//Ö¸¶¨Æðµã
dax.From = 0;
day.From = 0;
//Ö¸¶¨ÖÕµã
Random rdm = new Random();
dax.To = rdm.NextDouble() * 300;
day.To = rdm.NextDouble() * 300;
//Ö¸¶¨Ê±³¤
Duration duration = new Duration(TimeSpan.FromMilliseconds(3000));
dax.Duration = duration;
day.Duration = duration;
//¶¯»­Ö÷ÌåÊÇTranslatTransform±äÐΣ¬¶ø·ÇButton
this.tt.BeginAnimation(TranslateTransform.XProperty,dax);
this.tt.BeginAnimation(TranslateTransform.YProperty,day);
}

ÒòΪTranslateTransformµÄX,YÊôÐÔ¾ùΪDoubleÀàÐÍ£¬ËùÓÐÎÒÃÇÑ¡ÓÃDoubleAnimationÀ´Ê¹Ö®²úÉú±ä»¯¡£´úÂëÖÐÉùÃ÷µÄdax¡¢dayÁ½¸öDoubleAnimation±äÁ¿²¢·Ö±ðΪ֮´´½¨ÒýÓÃʵÀý¡£½ÓÏÂÀ´µÄ´úÂëÒÀ´ÎΪËüÃÇÉèÖÃÁËÆðʼֵ¡¢ÖÕÖ¹Öµ¡¢±ä»¯Ê±¼ä¡£×îºó£¬µ÷ÓÃBeginAnimation·½·¨£¬ÈÃdax×÷ÓÃÔÚTranslateTransformµÄXPropertyÊôÐÔÉÏ£¬ÈÃday×÷ÓÃÔÚTranslateTransformµÄYPropertyÊôÐÔÉÏ¡£ÔËÐгÌÐò£¬Ã¿´Îµ¥»÷°´Å¥£¬°´Å¥¶¼»á´ÓÆðʼλÖ㨴°ÌåµÄ×óÉϽǣ©Ïò´°ÌåµÄÓÒϽdz¤¿í²»³¬¹ý300ÏñËØµÄ¾ØÐÎÄÚµÄijµãÔ˶¯£¬Íê³ÉÔ˶¯µÄʱ³¤Îª300ºÁÃë¡£ÔËÐÐЧ¹ûÈçÏÂͼ£º

Õâ¶Î´úÂëÓÐÒÔϼ¸´¦ÖµµÃ×¢ÒâµÄµØ·½£º

ÒòΪָ¶¨ÁËdaXºÍdaYµÄÆðʼֵΪ0£¬ËùÒÔÿ´Î°´Å¥¶¼»á¡°Ìø¡±»Ø´°ÌåµÄ×óÉϽǿªÊ¼¶¯»­¡£Èç¹ûÏëÈð´Å¥´Óµ±Ç°Î»ÖÿªÊ¼ÏÂÒ»´Î¶¯»­£¬Ö»ÐèÒª°Ñ¡°dax.From=0;¡±ºÍ"day.From=0"È¥µô¼´¿É¡£

¾¡¹Ü±íÏÖ³öÀ´µÄÊÇbuttonÔÚÒÆ¶¯£¬µ«DoubleAnimationµÄ×÷ÓÃÄ¿±ê²¢²»ÊÇButton¶øÊÇTranslateTransformʵÀý£¬ÒòΪTranslateTransformʵÀýÊÇButtonµÄRenderTransformÊôÐÔ£¬ËùÒÔButton¡°¿´ÉÏÈ¥¡±ÊÇÒÆ¶¯ÁË¡£

Ç°ÃæËµ¹ý£¬ÄÜÓÃÀ´ÖÆ×÷¶¯»­Ð§¹ûµÄÊôÐÔ±ØÐëÊÇÒÀÀµÊôÐÔ£¬TranslateTransformµÄXPropertyºÍYProperty¾ÍÊÇÁ½¸öÒÀÀµÊôÐÔÖµ¡£

UIElementºÍAnimationÁ½¸öÀà¶¼¶¨ÒåÁËBeginAnimationÕâ¸ö·½·¨¡£TranslateTransformÅÉÉú×ÔAnimationÀ࣬ËùÒÔ¾ßÓÐÕâ¸ö·½·¨¡£Õâ¸ö·½·¨µÄµ÷ÓÃÕß¾ÍÊǶ¯»­Òª×÷ÓõÄÄ¿±ê¶ÔÏó£¬Á½¸ö²ÎÊý·Ö±ðÖ¸Ã÷±»×÷ÓõÄÒÀÀµÊôÐÔ£¨TranslateTransform.XPropertyºÍTranslateTransform.YProperty£©ºÍÉè¼ÆºÃµÄ¶¯»­(daxºÍday)¡£¿ÉÒÔ²ÂÏ룬Èç¹ûÒª¶¯»­¸Ä±äButtonµÄ¿í¶ÈºÍ¸ß¶È£¨ÕâÁ½¸öÊôÐÔÒ²ÊÇdoubleÀàÐÍ£©£¬Ò²Ó¦¸ÃÊ×ÏÈ´´½¨DoubleAnimationʵÀý£¬È»ºóÉèÖÃÆðÖÁÖµºÍ¶¯»­Ê±¼ä£¬×îºóµ÷ÓÃButtonµÄBeginAnimation·½·¨£¬Ê¹Óö¯»­¶ÔÏóÓ°ÏìButtonµÄWidthPropertyºÍHeightProperty¡£

Èç¹û°Ñʼþ´¦ÀíÆ÷ÖеĴúÂë¸Ä³ÉÕâÑù£º

private void Button_Click(object sender, RoutedEventArgs e)  
{
DoubleAnimation dax = new DoubleAnimation();
DoubleAnimation day = new DoubleAnimation();
//Ö¸¶¨Æðµã
//dax.From = 0;
//day.From = 0;
//Ö¸¶¨ÖÕµã
//Random rdm = new Random();
//dax.To = rdm.NextDouble() * 300;
//day.To = rdm.NextDouble() * 300;
dax.By=100D;
day.By = 100D;
//Ö¸¶¨Ê±³¤
Duration duration = new Duration(TimeSpan.FromMilliseconds(300));
dax.Duration = duration;
day.Duration = duration;
//¶¯»­Ö÷ÌåÊÇTranslatTransform±äÐΣ¬¶ø·ÇButton
this.tt.BeginAnimation(TranslateTransform.XProperty,dax);
this.tt.BeginAnimation(TranslateTransform.YProperty,day);
}

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

2 ¸ß¼¶¶¯»­¿ØÖÆ

ʹÓÃFrom¡¢To¡¢By¡¢Duration¼¸¸öÊôÐÔ½øÐÐ×éºÏÒѾ­¿ÉÒÔÖÆ×÷ºÜ¶à²»Í¬Ð§¹ûµÄ¶¯»­ÁË£¬È»¶øWPFµÄ¶¯»­ÏµÍ³µÄ¿ØÖÆÊôÐÔÔ¶Ô¶²»Ö¹ÕâЩ¡£Èç¹ûÏëÖÆ×÷³ö¸ü¼Ó¸´ÔÓ»ò±ÆÕæµÄ¶¯»­£¬»¹ÐèҪʹÓÃÈçÏÂһЩЧ¹û£º

¶ÔÓÚÕâЩÊôÐÔ£¬´ó¼Ò¿ÉÒÔ×Ô¼º¶¯ÊÖ³¢ÊÔ---¶ÔËüÃǽøÐÐ×éºÏÍùÍù¿ÉÒÔ²úÉúºÜ¶àÒâÏë²»µ½µÄЧ¹û¡£

ÔÚÕâЩÊôÐÔÖУ¬EasingFunctionÊÇÒ»¸öÀ©Õ¹ÐԷdz£Ç¿µÄÊôÐÔ¡£ËüµÄȡֵÀàÐÍÊÇÒ»¸öIEasingFunction½Ó¿ÚÀàÐÍ£¬¶øWPF×Ô´øµÄIEasingFunctionÅÉÉúÀà¾ÍÓÐ10¶àÖÖ£¬Ã¿¸öÅÉÉúÀà¶¼ÄܲúÉú²»Í¬µÄ½áÊøÐ§¹û¡£±ÈÈçBounceEase¿ÉÒÔ²úÉúƹÅÒÇòµ¯ÌøÊ½Ð§¹û£¬ÎÒÃÇ¿ÉÒÔÖ±½ÓÄÃÀ´Ê¹Óöø²»±Ø»¨¾«Á¦Ç××Ô´´×÷¡£

Èç¹û°ÑÇ°ÃæµÄÀý×ӸijÉÕâÑù£º

private void Button_Click(object sender, RoutedEventArgs e)  
{
DoubleAnimation dax = new DoubleAnimation();
DoubleAnimation day = new DoubleAnimation();

//ÉèÖ÷´µ¯
BounceEase be = new BounceEase();
//ÉèÖ÷´µ¯´ÎÊýΪ3
be.Bounces = 3;
be.Bounciness = 3;//µ¯ÐԳ̶ȣ¬ÖµÔ½´ó·´µ¯Ô½µÍ
day.EasingFunction = be;

//ÉèÖÃÖÕµã
dax.To = 300;
day.To = 300;

//Ö¸¶¨Ê±³¤
Duration duration = new Duration(TimeSpan.FromMilliseconds(2000));
dax.Duration = duration;
day.Duration = duration;
//¶¯»­Ö÷ÌåÊÇTranslatTransform±äÐΣ¬¶ø·ÇButton
this.tt.BeginAnimation(TranslateTransform.XProperty,dax);
this.tt.BeginAnimation(TranslateTransform.YProperty,day);
}

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

3 ¹Ø¼üÖ¡¶¯»­

¶¯»­ÊÇUIÔªËØÊôÐÔÁ¬Ðø·¢Ëͱ仯²úÉúµÄÊÓ¾õЧ¹û¡£ÊôÐÔÿ´Îϸ΢µÄ±ä»¯¶¼»á²úÉúÒ»¸öÐµĻ­Ã棬ÿ¸öл­Ãæ¾Í³ÆÎªÒ»Ö¡£¬Ö¡µÄÁ¬Ðø²¥·Å¾Í²úÉúÁ˶¯»­Ð§¹û¡£ÈçͬµçÓ°Ò»Ñù£¬µ¥Î»Ê±¼äÄÚ²¥·ÅµÄÖ¡ÊýÔ½¶à£¬¶¯»­µÄЧ¹û¾Í»áԽϸÖ¡£Ç°Ãæ½²µ½µÄ¼òµ¥¶¯»­Ö»ÉèÖÃÁËÆðµãºÍÖյ㣬֮¼äµÄ¶¯»­Ö¡¶¼ÊÇÓɳÌÐò¼ÆËã³öÀ´²¢»æÖƵ쬳ÌÐòÔ±ÎÞ·¨½øÐпØÖÆ¡£¹Ø¼üÖ¡¶¯»­ÔòÔÊÐí³ÌÐòԱΪһ¶Î¶¯»­ÉèÖü¸¸ö¡°Àï³Ì±®¡±£¬¶¯»­Ö´Ðе½Àï³Ì±®ËùÔÚµÄʱ¼äµãʱ£¬±»¶¯»­¿ØÖƵÄÊôÐÔÖµÒ²±ØÐë´ïµ½É趨µÄÖµ£¬ÕâЩʱ¼äÏßÉϵġ°Àï³Ì±®¡±¾ÍÊǹؼüÖ¡¡£

˼¿¼ÕâÑùÒ»¸öÐèÇó£ºÎÒÏëÈÃÒ»¸öButtonÓÃ900ºÁÃëµÄʱ¼ä´Ó×óÉϽÇÒÆ¶¯µ½ÓÒϽǣ¬µ«Òƶ¯µÄ·Ïß²»ÊÇÖ±½Ó×ß¶¯¶øÊÇ×ßZ×ÖÐΡ£ÈçÏÂͼËùʾ£º

Èç¹ûÎÒÃDz»ÖªµÀÓйؼüÖ¡¶¯»­¿ÉÓöøÖ»Ê¹Óüòµ¥µÄ¶¯»­£¬ÄÇôÎÒÃÇÐèÒª´´½¨Èô¸É¸ö¼òµ¥µÄ¶¯»­·Ö±ð¿ØÖÆTranslateTransformµÄXºÍY£¬±È½Ï¼¬ÊÖµÄÊÇÐèÒª¿ØÖÆÕâЩ¶¯»­Ö®¼äµÄЭͬ¡£Ð­Í¬²ßÂÔÓÐÁ½ÖÖ£¬Ò»ÖÖÊÇ¿¿Ê±¼äÀ´Ð­Í¬£¬Ò²¾ÍÊÇÉèÖúóÖ´Ðж¯»­µÄBeginTimeÒԵȴýÇ°Ãæ¶¯»­Ö´ÐÐÍê±Ï£¬ÁíÒ»ÖÖÊÇ¿¿Ê¼þЭͬ£¬Ò²¾ÍÊÇΪÏÈÖ´Ðе͝»­Ìí¼ÓComplatedʼþ´¦ÀíÆ÷£¬ÔÚʼþ´¦ÀíÆ÷ÖпªÊ¼ÏÂÒ»¶Î¶¯»­¡£ÒòΪÊǶà¸ö¶¯»­µÄЭͬ£¬ËùÒÔÔÚ¶¯»­ÐèÒª¸Ä±äµÄʱºò£¬´úÂëµÄ¸Ä¶¯»á±È½Ï´ó¡£

ʹÓùؼüÖ¡¶¯»­Çé¿ö¾Í»á´óÓиĹÛ----ÎÒÃÇÖ»ÐèÒª´´½¨Á½¸öDoubleAnimationUsingKeyFramesʵÀý£¬Ò»¸ö¿ØÖÆTranslateTransFormµÄXÊôÐÔ£¬ÁíÒ»¸ö¿ØÖÆTranslateTransFormµÄYÊôÐÔ¼´¿É¡£Ã¿¸öDoubleAnimationUsingKyeFrames¸÷ÓµÓÐ3¸ö¹Ø¼üÖ¡ÓÃÓÚÖ¸Ã÷X»òYÔÚÈý¸öʱ¼äµã£¨Á½¸ö¹ÕµãºÍÒ»¸öÖյ㣩Ӧ¸Ã´ïµ½Ê²Ã´ÑùµÄÖµ¡£

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

<Window x:Class="WpfApplication1.Window61"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window61" Height="372" Width="475">
<Grid>
<Button Width="80" Height="80" HorizontalAlignment="Left" VerticalAlignment="Top" Click="Button_Click">
<Button.RenderTransform>
<TranslateTransform X="0" Y="0" x:Name="tt"></TranslateTransform>
</Button.RenderTransform>
</Button>
</Grid>
</Window>

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

private void Button_Click(object sender, RoutedEventArgs e)  
{
DoubleAnimationUsingKeyFrames dakX = new DoubleAnimationUsingKeyFrames();
DoubleAnimationUsingKeyFrames dakY = new DoubleAnimationUsingKeyFrames();
//ÉèÖö¯»­×Üʱ³¤
dakX.Duration = new Duration(TimeSpan.FromMilliseconds(900));
dakY.Duration = new Duration(TimeSpan.FromMilliseconds(900));
//´´½¨£¬Ìí¼Ó¹Ø¼üÖ¡
LinearDoubleKeyFrame x_kf_1 = new LinearDoubleKeyFrame();
LinearDoubleKeyFrame x_kf_2 = new LinearDoubleKeyFrame();
LinearDoubleKeyFrame x_kf_3 = new LinearDoubleKeyFrame();
x_kf_1.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(300));
x_kf_1.Value = 200;
x_kf_2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(600));
x_kf_2.Value = 0;
x_kf_3.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(900));
x_kf_3.Value = 200;
dakX.KeyFrames.Add(x_kf_1);
dakX.KeyFrames.Add(x_kf_2);
dakX.KeyFrames.Add(x_kf_3);

LinearDoubleKeyFrame y_kf_1 = new LinearDoubleKeyFrame();
LinearDoubleKeyFrame y_kf_2 = new LinearDoubleKeyFrame();
LinearDoubleKeyFrame y_kf_3 = new LinearDoubleKeyFrame();
y_kf_1.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(300));
y_kf_1.Value = 0;
y_kf_2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(600));
y_kf_2.Value = 180;
y_kf_3.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(900));
y_kf_3.Value = 180;
dakY.KeyFrames.Add(y_kf_1);
dakY.KeyFrames.Add(y_kf_2);
dakY.KeyFrames.Add(y_kf_3);

//Ö´Ðж¯»­
tt.BeginAnimation(TranslateTransform.XProperty, dakX);
tt.BeginAnimation(TranslateTransform.YProperty,dakY);
}

ÔÚÕâ×鹨¼üÖ¡¶¯»­ÖУ¬ÎÒÃÇʹÓÃÁË×î¼òµ¥µÄ¹Ø¼üÖ¡LinearDoubleKeyFrame£¬ÕâÖֹؼüÖ¡µÄÌØµã¾ÍÊÇÖ»ÐèÒªÄã¸ø¶¨Ê±¼äµã£¨KeyTimeÊôÐÔ£©ºÍµ½´ïʱ¼äµãʱµÄÄ¿±êÊôÐÔÖµ£¨ValueÊôÐÔ£©¶¯»­¾Í»áÈÃÄ¿±êÊôÐÔÖµÔÚÁ½¸ö¹Ø¼üÖ¡Ö®¼äÔÈËÙÔ˶¯¡£±ÈÈçÕâÁ½¾ä´úÂ룺

x_kf_1.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(300));  
x_kf_1.Value = 200;
x_kf_2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(600));
x_kf_2.Value = 0;

x_kf_1¹Ø¼üÖ¡´¦ÔÚʱ¼äÏß300ºÁÃë´¦£¬Ä¿±êÊôÐÔÖµÔÚÕâһʱ¿Ì±ØÐë´ïµ½200£¨ÊÇʲôÊôÐÔÕâ¸öʱºò²¢²»ÖªµÀ£¬µ«ÒªÇóÕâ¸öÊôÐÔÖµÔÚÕâ¸öʱ¼äÒ»¶¨Òª´ïµ½200£©£¬ÀàËÆ£¬x_kf_2ÔÚʱ¼äÏßµÄλÖÃÊÇ600ºÁÃë´¦£¬Ä¿±êÊôÐÔµÄֵΪ0¡£µ±¶¯»­¿ªÊ¼Ö´ÐÐÖ®ºó£¬³ÌÐò»á×Ô¶¯¼ÆËã³öÄ¿±êÊôÐÔÔÚÕâÁ½¸ö¹Ø¼üÖ¡Ö®¼äµÄÔÈËٱ仯¡£

Ç°ÃæµÄ´úÂëÖУ¬Îª¹Ø¼üÖ¡µÄKeyTimeÊôÐÔʹÓõÄÊÇKeyTime.FromTimeSpan¾²Ì¬·½·¨£¬ÕâÑù¿ÉÒԵõ½Ò»¸ö¾ø¶ÔµÄʱ¼äµã¡£Ê¹ÓÃKeyTime.FromPercent¾²Ì¬·½·¨Ôò¿ÉÒÔ»ñµÃ°Ù·Ö±È¼ÆËãµÄÏà¶Ôʱ¼äµã£¬³ÌÐò½«Õû¸ö¹Ø¼üÖ¡µÄ¶¯»­Ê±³¤£¨Duration£©ÊÓΪ100%¡£ÎÒÃǾͿÉÒÔ°ÑÇ°ÃæµÄ´úÂë¸Ä³ÉÕâÑù£º

x_kf_1.KeyTime = KeyTime.FromPercent(0.33);  
x_kf_1.Value = 200;
x_kf_2.KeyTime = KeyTime.FromPercent(0.66);
x_kf_2.Value = 0;
x_kf_3.KeyTime = KeyTime.FromPercent(1);
x_kf_3.Value = 200;
dakX.KeyFrames.Add(x_kf_1);
dakX.KeyFrames.Add(x_kf_2);
dakX.KeyFrames.Add(x_kf_3);

Ö®ºóÎÒÃÇÎÞÂÛ½«dakXµÄDuration¸ÄΪ¶àÉÙ£¬3¸ö¹Ø¼üÖ¡¶¼»á½«Õâ¸öʱ¼ä»®·ÖΪ¾ùµÈµÄ3¶Î¡£

4 ÌØÊâ¹Ø¼üÖ¡

DoubleAnimationUsingKeyFramesµÄKeyFramesÊôÐÔµÄÊý¾ÝÀàÐÍÊÇDoubleKeyFrameCollection£¬´Ë¼¯ºÏÀà¿É½ÓÊÕµÄÔªËØÀàÐÍÊÇDoubleKeyFrame¡£DoubleKeyFrameÊÇÒ»¸ö³éÏóÀà£¬Ç°ÃæÊ¹ÓõÄLinearDoubleKeyFrame¾ÍÊÇËüµÄÅÉÉúÀàÖ®Ò»¡£DoubleKeyFrameµÄËùÓÐÅÉÉúÀàÈçÏ£º

LinearDoubleKeyFrame£ºÏßÐԱ仯¹Ø¼üÖ¡£¬Ä¿±êÊôÐÔÖµµÄ±ä»¯ÊÇÏßÐԵġ¢¾ùÔȵ쬼´±ä»¯ËÙÂʲ»±ä¡£

DisCreteDoubleKeyFrame£º²»Á¬Ðø±ä»¯¹Ø¼üÖ¡£¬Ä¿±êÊôÐÔÖµ±ä»¯ÊÇÌøÔ¾ÐԵģ¬Ô¾Ç¨µÄ¡£

SplineDoubleKeyFrame£ºÑùÌõº¯Êýʽ±ä»¯Ö¡£¬Ä¿±êÊôÐԵı仯ֵÊÇÒ»Ìõ±´Èû¶ûÇúÏß¡£

EasingDoubleKeyFrame£º»º³åÊDZ仯¹Ø¼üÖ¡£¬Ä¿±êÊôÐÔÖµÒÔijÖÖ»º³åÐÎʽ±ä»¯¡£

4¸öÅÉÉúÀàÖÐ×î³£ÓõľÍÊÇSplineDoubleKeyFrame£¨SplineDoubleKeyFrame¿ÉÒÔÌæ»»LinearDoubleKeyFrame£©¡£Ê¹ÓÃSplineDoubleKeyFrame¿ÉÒÔ·½±ãµÄÖÆ×÷·ÇÔÈËÙ¶¯»­£¬ÒòΪËüʹÓÃÒ»ÌõÈü±´¶ûÇúÏßÀ´¿ØÖÆÄ¿±êÊôÐԵı仯ËÙÂÊ¡£ÕâÌõÓÃÓÚ¿ØÖÆÄ¿±êÊôÐԱ仯ËÙÂʵı´Èû¶ûÇúÏߵįðµãÊÇ(0,0)ºÍ(1,1),·Ö±ðÓ³Éä×ÅÄ¿±êÊôÐԵı仯ÆðµãºÍ±ä»¯Öյ㣬Òâ˼ÊÇÄ¿±êÊôÐÔÓÉ0%±ä»¯µ½100%¡£ÕâÌõ±´Èû¶ûÇúÏßÓÐÁ½¸ö¿ØÖƵã----ControlPoint1ºÍControlPoint2£¬Òâ˼ÊDZ´Èû¶ûÇúÏß´ÓÆðµã³ö·¢ÏÈÏëControlPoint1ÒÆ¶¯¡¢ÔÙÏòControlPoint2ÒÆ¶¯£¬×îºóµ½´ïÖյ㣬ÐγÉÒ»Ìõƽ»¬µÄÇúÏß¡£Èç¹ûÉèÖÃControlPoint1ºÍControlPoint2µÄºá×ø±êÖµÏàµÈ£¬±ÈÈç(0,0)¡¢(0.5,0.5)¡¢(1,1)Ôò±´Èû¶ûÇúÏßÊÇÒ»ÌõÖ±Ïߣ¬ÕâʱºòSplineDoubleKeyFrameºÍLinearDoubleKeyFrameÊǵȼ۵ġ£µ±¿ØÖƵãµÄºá×Ý×ø±ê²»ÏàµÈʱ£¬±´Èû¶ûÇúÏ߾ͻá³öÏֺܶà±ä»¯¡£ÈçÏÂͼËùʾ£¬ÕâЩÊDZ´Èû¶ûÇúÏß¿ØÖƵ㴦µÄµäÐÍλÖÃÊdzöÏÖµÄËÙÂÊÇúÏߣ¬X1,Y1ÊÇControlPoint0µÄ×ø±ê£¬X2,Y2ÊÇControlPoint2µÄ×ø±ê¡£

ÏÂÃæÊÇÒ»¸öSplineDoubleKeyFrameµÄÒ»¸öʵÀý¡£³ÌÐòµÄXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window62"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window62" Height="303" Width="544">
<Grid Margin="10" Background="AliceBlue">
<Button Width="80" Height="80" Content="Move" HorizontalAlignment="Left" VerticalAlignment="Top" Click="Button_Click">
<Button.RenderTransform>
<TranslateTransform x:Name="tt" X="0" Y="0"></TranslateTransform>
</Button.RenderTransform>
</Button>
</Grid>
</Window>

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

private void Button_Click(object sender, RoutedEventArgs e)  
{
//´´½¨¶¯»­
DoubleAnimationUsingKeyFrames dakX = new DoubleAnimationUsingKeyFrames();
dakX.Duration = new Duration(TimeSpan.FromMilliseconds(1000));

//´´½¨¡¢Ìí¼Ó¹Ø¼üÖ¡
SplineDoubleKeyFrame kf = new SplineDoubleKeyFrame();
kf.KeyTime = KeyTime.FromPercent(1);
kf.Value = 400;

KeySpline ks = new KeySpline();
ks.ControlPoint1 = new Point(0,1);
ks.ControlPoint2 = new Point(1,0);

kf.KeySpline = ks;
dakX.KeyFrames.Add(kf);

//Ö´Ðж¯»­
this.tt.BeginAnimation(TranslateTransform.XProperty ,dakX);
}

¹Ø¼üÖ¡¶¯»­»á¿ØÖÆButtonµÄλÖñäÐΡ¢ÈÃButtonºáÏòÔ˶¯¡£Õû¸ö¶¯»­Ö»ÓÐÒ»¸ö¹Ø¼üÖ¡£¬Õâ¸ö¹Ø¼ü֡ʹÓõÄÊÇSplineDoubleKeyFrame£¬±ä»¯ËÙÂÊ¿ØÖÆÇúÏßµÄÁ½¸ö¿ØÖƵã·Ö±ðÊÇ(0,1)ºÍ(1,0)¡£ÓëÉÏͼÖеÄ×îºóÒ»·ùͼһÖ£¬Òò´ËÄ¿±êÊôÐÔ»áÒÔ¿ì--Âý---¿ìµÄÐÎʽ±ä»¯¡£³ÌÐòµÄÖ´ÐÐЧ¹ûÈçÏÂͼËùʾ£º

5. ·¾¶¶¯»­

ÈçºÎÈÃÄ¿±ê¶ÔÏóÑØ×ÅÒ»Ìõ¸ø¶¨µÄ·¾¶Òƶ¯ÄØ£¿´ð°¸ÊÇʹÓÃDoubleAnimationUsingPathÀà¡£DoubleAnimationUsingPathÐèÒªÒ»¸öPathGeometryÀ´Ö¸Ã÷ÒÆ¶¯Â·¾¶£¬PathGeometryµÄÊý¾ÝÐÅÏ¢¿ÉÒÔÓÃXAMLÖеÄPathÓï·¨Êéд¡£PathGeometryµÄÁíÍâÒ»¸öÖØÒªÊôÐÔÊÇSource£¬SourceÊôÐÔµÄÊý¾ÝÀàÐÍÊÇPathAnimationSourceö¾Ù£¬Ã¶¾ÙÖµ¿ÉÈ¡X¡¢Y»òAngle¡£Èç¹û·¾¶¶¯»­SourceÊôÐÔµÄȡֵÊÇPathAnimationSource.X£¬Òâζ×ÅÕâ¸ö¶¯»­¹Ø×¢µÄÊÇÇúÏßÉÏÿһµãºá×ø±êµÄ±ä»¯¡£Èç¹û·¾¶¶¯»­SourceÊôÐÔµÄȡֵÊÇPathAnimationSource.Y£¬Òâζ×ÅÕâ¸ö¶¯»­¹Ø×¢µÄÊÇÇúÏßÉÏÿһµã×Ý×ø±êµÄ±ä»¯£»Èç¹û·¾¶¶¯»­µÄSourceÊôÐÔȡֵÊÇPathAnimationSource.Angle£¬Òâζ×ÅÕâ¸ö¶¯»­¹Ø×¢µÄÊÇÇúÏßÉÏÿһµãÇÐÏß·½ÏòµÄ±ä»¯¡£
ÏÂÃæÕâ¸öÀý×Ó½²µÄÊÇÈÃÒ»¸öButtonÑØ×ÅÒ»Ìõ±´Èû¶ûÇúÏß×ö²¨ÀËÔ˶¯¡£³ÌÐòµÄXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window63"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window63" Height="314" Width="517">
<Grid x:Name="layoutRoot">
<Grid.Resources>
<!--ÒÆ¶¯Â·¾¶-->
<PathGeometry x:Key="movePath" Figures="M 0,50 C 300,-100 300,400 600,120"></PathGeometry>
</Grid.Resources>
<Button Content="Move" Width="80" Height="80" HorizontalAlignment="Left" VerticalAlignment="Top" Click="Button_Click">
<Button.RenderTransform>
<TranslateTransform X="0" Y="0" x:Name="tt"></TranslateTransform>
</Button.RenderTransform>
</Button>
</Grid>
</Window>

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

private void Button_Click(object sender, RoutedEventArgs e)  
{
//´ÓXAML´úÂëÖлñÈ¡ÒÆ¶¯Â·¾¶Êý¾Ý
PathGeometry pg = this.layoutRoot.FindResource("movePath") as PathGeometry;
Duration duration = new Duration(TimeSpan.FromMilliseconds(600));

//´´½¨¶¯»­
DoubleAnimationUsingPath dpX = new DoubleAnimationUsingPath();
dpX.Duration = duration;
dpX.PathGeometry = pg;
dpX.Source = PathAnimationSource.X;

DoubleAnimationUsingPath dpY = new DoubleAnimationUsingPath();
dpY.Duration = duration;
dpY.PathGeometry = pg;
dpY.Source = PathAnimationSource.Y;

//Ö´Ðж¯»­
this.tt.BeginAnimation(TranslateTransform.XProperty,dpX);
this.tt.BeginAnimation(TranslateTransform.YProperty,dpY);

}

¸ÐÐËȤµÄ»°£¬ºÚ¿ÉÒÔΪ¶¯»­Ìí¼Ó×Ô¶¯·µ»ØºÍÑ­»·¿ØÖÆ´úÂ룺

dpX.AutoReverse = true;  
dpX.RepeatBehavior = RepeatBehavior.Forever;
dpY.AutoReverse = true;
dpY.RepeatBehavior = RepeatBehavior.Forever;

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

1.4.2 ³¡¾°

³¡¾°£¬StroyBoard¾ÍÊDz¢ÐÐÖ´ÐÐÒ»×鶯»­£¨Ç°Ãæ½²ÊöµÄ¹Ø¼üÖ¡¶¯»­ÔòÊÇ´®ÐеÄÖ´ÐÐÒ»×鶯»­£©¡£

Èç¹ûÄãÊÇһλµ¼ÑÝ£¬µ±Äã¶ÔÕվ籾¹¹Ë¼Ò»¸ö³¡¾°µÄʱºòÄÔ×ÓÀïÒ»¶¨ÏëµÄÊÇÓ¦¸ÃÓжàÉÙ¸öÑÝÔ±²Î¼Óµ½ÁËÕâ¸ö³¡¾°¡¢ËüÃǶ¼ÊÇʲôÑÝÔ±¡¢Ö÷½Ç/Åä½Ç/ȺÖÚÑÝÔ±·Ö±ðʲôʱºòµ½³¡¡¢Ã¿¸öÑÝÔ±¸Ã˵ʲô£¿×öʲô£¿... ...ÑÝÔ±¾ßÌåÓÃË­£¿Óɳ¡¾°µÄÐèÒªÀ´¶¨¡£µ½Ê±ºò¿ª»úµÄʱºò£¬Ò»ÉùÁîÏ£¬ËùÓÐÑÝÔ±¶¼»á°´ÕÕÔ¤ÏÈ·ÖÅäºÃµÄ½Å±¾½øÐбíÑÝ£¬Ò»¸öÓ°ÊÓÆ¬¶Î¾ÍËã¼³ÉÁË¡£

Éè¼ÆWPFµÄ³¡¾°Ê±Çé¿öÒ²²î²»¶à£¬ÏÈÊǰÑÒ»×é¶ÀÁ¢µÄ¶¯»­×éÖ¯ÔÚÒ»¸öStoryBoardÔªËØÖС¢°²ÅźÃËüÃǵÄЭ×÷¹ØÏµ£¬È»ºóÖ¸¶¨Äĸö¶¯»­ÓÉÄĸöUIÔªËØ£¬ÄĸöÊôÐÔ¸ºÔðÍê³É¡£StoryBoardÉè¼ÆºÃºó£¬Äã¿ÉÒÔΪËüÑ¡ÔñÒ»¸öÇ¡µ±µÄ´¥·¢Ê±»ú£¬±ÈÈç°´Å¥°´ÏÂʱ»òÕßÏÂÔØ¿ªÊ¼Ê±¡£Ò»µ©´¥·¢Ìõ¼þ±»Âú×㣬¶¯»­³¡¾°¾Í»á¿ªÊ¼Ö´ÐУ¬Óû§¾Í»á¿´µ½Ö´ÐÐЧ¹û¡£

ÏÂÃæÊÇÒ»¸öSotryBoardÀý×Ó¡£³ÌÐòµÄXAML´úÂëÈçÏ£º

<Window x:Class="WpfApplication1.Window64"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window64" Height="159" Width="461">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="38" />
<RowDefinition Height="38" />
<RowDefinition Height="38" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="60" />
</Grid.ColumnDefinitions>
<!--ÅܵÀ(ºì)-->
<Border Grid.Row="0" BorderBrush="Gray" BorderThickness="1">
<Ellipse Width="36" Height="36" Fill="Red" HorizontalAlignment="Left" x:Name="ballR">
<Ellipse.RenderTransform>
<TranslateTransform X="0" Y="0" x:Name="ttR">
</TranslateTransform>
</Ellipse.RenderTransform>
</Ellipse>
</Border>
<!--ÅܵÀ(ÂÌ)-->
<Border Grid.Row="1" BorderBrush="Gray" BorderThickness="1,0,1,1">
<Ellipse Width="36" Height="36" Fill="Green" HorizontalAlignment="Left" x:Name="ballG">
<Ellipse.RenderTransform>
<TranslateTransform X="0" Y="0" x:Name="ttG">
</TranslateTransform>
</Ellipse.RenderTransform>
</Ellipse>
</Border>
<!--ÅܵÀ(À¶)-->
<Border Grid.Row="2" BorderBrush="Gray" BorderThickness="1,0,1,1">
<Ellipse Width="36" Height="36" Fill="Blue" HorizontalAlignment="Left" x:Name="ballB">
<Ellipse.RenderTransform>
<TranslateTransform X="0" Y="0" x:Name="ttB">
</TranslateTransform>
</Ellipse.RenderTransform>
</Ellipse>
</Border>
<!--°´Å¥-->
<Button Content="Go" Grid.RowSpan="3" Grid.Column="1" Click="Button_Click"></Button>
</Grid>
</Window>

³ÌÐòµÄUIЧ¹ûͼÈçÏÂͼ,µ¥»÷°´Å¥ºó,Èý¸öСÇò·Ö±ðÔÚ²»Í¬µÄʱ¼ä¿ªÊ¼ÏòÓÒÒÔ²»Í¬µÄËÙ¶ÈÒÆ¶¯¡£

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

private void Button_Click(object sender, RoutedEventArgs e)  
{
Duration duration = new Duration(TimeSpan.FromMilliseconds(600));

//ºìɫСÇòÔÈËÙÔ˶¯
DoubleAnimation daRx = new DoubleAnimation();
daRx.Duration = duration;
daRx.To = 400;

//ÂÌɫСÇò×ö±äËÙÔ˶¯
DoubleAnimationUsingKeyFrames dakGx = new DoubleAnimationUsingKeyFrames();
dakGx.Duration = duration;
SplineDoubleKeyFrame kfg = new SplineDoubleKeyFrame(400,KeyTime.FromPercent(1));
kfg.KeySpline = new KeySpline(1,0,0,1);
dakGx.KeyFrames.Add(kfg);

//À¶É«Ð¡Çò±äËÙÔ˶¯
DoubleAnimationUsingKeyFrames dakBx = new DoubleAnimationUsingKeyFrames();
dakBx.Duration = duration;
SplineDoubleKeyFrame kfb = new SplineDoubleKeyFrame(400,KeyTime.FromPercent(1));
kfb.KeySpline = new KeySpline(0,1,1,0);
dakBx.KeyFrames.Add(kfb);

//´´½¨³¡¾°
Storyboard storyBoard = new Storyboard();
Storyboard.SetTargetName(daRx,"ttR");
Storyboard.SetTargetProperty(daRx, new PropertyPath(TranslateTransform.XProperty));

Storyboard.SetTargetName(dakGx, "ttG");
Storyboard.SetTargetProperty(dakGx, new PropertyPath(TranslateTransform.XProperty));

Storyboard.SetTargetName(dakBx, "ttB");
Storyboard.SetTargetProperty(dakBx, new PropertyPath(TranslateTransform.XProperty));

storyBoard.Duration = duration;
storyBoard.Children.Add(daRx);
storyBoard.Children.Add(dakBx);
storyBoard.Children.Add(dakGx);

storyBoard.Begin(this);
storyBoard.Completed += (a, b) => { MessageBox.Show(ttR.X.ToString()); };
}

ÎãÓ¹ÖÃÒÉ,ʹÓÃC#´úÂëʵÏÖStoryBoard·Ç³£µÄ¸´ÔÓ,³öÁËÄÃÀ´Ñо¿»òÕßÓöµ½·ÇҪʹÓÃC#¶¯Ì¬´úÂë´´½¨StoryBoardµÄÇé¿ö,²»È»ÎÒÃǶ¼ÊÇÔÚXAMLÀïÃæ´´½¨StoryBoardµÄ¡£StoryBoardÒ»°ã·ÅÔÚUIÔªËØµÄTriggerÀTriggerÔÚ´¥·¢Ê±»áÖ´ÐÐ<BeginStoryBoard>±êÇ©ÖеÄSotryBoardʵÀý£º

<!--°´Å¥-->  
<Button Content="Go" Grid.RowSpan="3" Grid.Column="1" Click="Button_Click">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard Duration="0:0:0.6">
<!--ºìɫСÇò¶¯»­-->
<DoubleAnimation Duration="0:0:0.6" To="400" Storyboard.TargetName="ttR" Storyboard.TargetProperty="X">

</DoubleAnimation>
<!--ÂÌɫСÇò¶¯»­-->
<DoubleAnimationUsingKeyFrames Duration="0:0:0.6" Storyboard.TargetProperty="X" Storyboard.TargetName="ttG">
<SplineDoubleKeyFrame KeyTime="0:0:0.6" Value="400" KeySpline="1,0,0,1"></SplineDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
<!--À¶É«Ð¡Çò¶¯»­-->
<DoubleAnimationUsingKeyFrames Duration="0:0:0.6" Storyboard.TargetName="ttB" Storyboard.TargetProperty="X">
<SplineDoubleKeyFrame KeyTime="0:0:0.6" Value="400" KeySpline="0,1,1,0"></SplineDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>

³ýÁËΪButtonÌí¼ÓÁËTrigger²¢È¥µô¶ÔClickʼþµÄ¶©ÔÄÖ®Íâ,XAML´úÂëµÄÆäËü²¿·Ö²»×öÈκθ͝¡£¿ÉÒÔ¿´µ½£¬XAML´úÂë±àд¶¯»­±ÈC#´úÂë¼ò½àÁ˺ܶà-----BlendÉú³ÉµÄStoryBoard´úÂëÓëÖ®·Ç³£ÀàËÆ¡£

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