|
Style ÓÃÀ´ÔÚÀàÐ͵IJ»Í¬ÊµÀýÖ®¼ä¹²ÏíÊôÐÔ¡¢×ÊÔ´ºÍʼþ´¦Àí³ÌÐò£¬Äú¿ÉÒÔ½«
Style ¿´×÷Êǽ«Ò»×éÊôÐÔÖµÓ¦Óõ½¶à¸öÔªËØµÄ½Ý¾¶¡£
ÕâÊÇMSDNÉ϶ÔStyleµÄÃèÊö£¬·ÒëµÄ»¹ËãÖйæÖоء£Style£¨Ñùʽ£©£¬¼òµ¥À´Ëµ£¬¾ÍÊÇÒ»ÖÖ¶ÔÊôÐÔÖµµÄÅú´¦Àí£¬ÀàËÆÓÚHtmlµÄCSS£¬¿ÉÒÔ¿ìËÙµÄÉèÖÃһϵÁÐÊôÐÔÖµµ½UIÔªËØ¡£
ʾÀý
Ò»¸ö×î¼òµ¥µÄStyleµÄÀý×Ó£º
<Window> 2: <Grid> 3: <Grid.Resources> 4: <Style TargetType="{x:Type Button}" x:Key="ButtonStyle"> 5: <Setter Property="Height" Value="22"/> 6: <Setter Property="Width" Value="60"/> 7: </Style> 8: </Grid.Resources> 9: <Button Content="Button" Style="{StaticResource ButtonStyle}"/> 10: <Button Content="Button" Style="{StaticResource ButtonStyle}" Margin="156,144,286,145" /> 11: </Grid> 12: </Window>
|
¹ØÓÚResourcesµÄ֪ʶ£¬Çë²Î¼ûMSDN£¬ÕâÀï´´½¨ÁËÒ»¸öÄ¿±êÀàÐÍΪButtonµÄButtonStyle£¬Á½¸öButtonʹÓþ²Ì¬×ÊÔ´£¨StaticResource£©µÄ²éÕÒ·½Ê½À´ÕÒµ½Õâ¸öStyle¡£StyleÖж¨ÒåÁËButtonµÄ¸ß¶È£¨Height£©ºÍ¿í¶È£¨Width£©£¬µ±Ê¹ÓÃÁËÕâ¸öStyleºó£¬Á½¸öButtonÎÞÐèÊÖ¶¯ÉèÖ㬼´¿É×Ô¶¯ÉèÖÃËüÃǵĸ߶ȺͿí¶ÈΪButtonStyleµÄÔ¤ÉèÖµ22ºÍ60¡£
Style×÷ΪÊôÐÔ£¬×ÊÔ´£¬Ê¼þµÄÅú´¦Àí£¬ËüÌṩÁËÒ»Öֽݾ¶À´¶Ô¿Ø¼þ½øÐпìËÙÉèÖã¬Ê¹ÓÃStyleµÄºÃ´¦Óжþ£º
1.°ÑһЩ¿Ø¼þµÄͨÓÃÉèÖóé³öÀ´±ä³ÉStyle£¬Ê¹ÕâЩ¿Ø¼þ¾ßÓÐͳһµÄ·ç¸ñ£¬ÐÞ¸ÄStyleÖеÄÊôÐÔÖµ¿ÉÒÔ·½±ãµÄ×÷ÓÃÔÚËùÓÐÓ¦ÓøÃStyleµÄ¿Ø¼þÉÏ¡£
2.¿ÉÒÔ¶ÔͬһÀàÐͿؼþ¶¨Òå¶à¸öStyle£¬Í¨¹ýÌæ»»StyleÀ´·½±ãµÄ¸ü¸Ä¿Ø¼þµÄÑùʽ¡£
StyleµÄÔªËØ
ÉÏÃæStyleµÄÀý×ÓÖУ¬StyleÄÚ²¿Ê¹ÓÃÁËSetterÀ´¶¨Òå¿Ø¼þÊôÐÔµÄÔ¤ÉèÖµ£¬Style²»½öÖ§³Ö¶ÔÊôÐÔµÄÅú´¦Àí£¬Ò²¿ÉÒÔ¹²Ïí×ÊÔ´ºÍʼþ´¦Àí£¬È磺
<Window> 2: <Window.Resources> 3: <Style TargetType="{x:Type Button}" x:Key="ButtonStyle"> 4: <Style.Resources> 5: <SolidColorBrush x:Key="brush" Color="Yellow"/> 6: </Style.Resources> 7: <Setter Property="Height" Value="22"/> 8: <Setter Property="Width" Value="60"/> 9: <EventSetter Event="Loaded" Handler="Button_Loaded"/> 10: </Style> 11: </Window.Resources> 12: <x:Code> 13: <![CDATA[ 14: void Button_Loaded(object sender, RoutedEventArgs e) 15: { 16: MessageBox.Show((sender as Button).Name + " Loaded"); 17: } 18: ]]> 19: </x:Code> 20: <Grid> 21: <Button x:Name="button1" Style="{StaticResource ButtonStyle}" Background="{DynamicResource brush}"/> 22: <Button x:Name="button2" Style="{StaticResource ButtonStyle}"
Background="{DynamicResource brush}" Margin="156,144,286,145" /> 23: </Grid> 24: </Window>
|
StyleÖж¨ÒåÁË×ÊÔ´SolidColorBrush£¬¶¨ÒåÁËÊôÐÔHeightºÍWidth£¬ÒÔ¼°Ê¹ÓÃÁËEventSetterÀ´¶¨ÒåÁËLoadedʼþµÄ´¦Àí¡£
Trigger
StyleʹÓÃÁËSetterºÍEventSetterÀ´·Ö±ðÉèÖÿؼþµÄÊôÐÔºÍʼþ´¦Àí£¬SetterÕâ¸öµ¥´ÊµÄº¬ÒåÊÇÉèÖá£StyleÔÚÉè¼ÆºÃÁËÕâÁ½ÖÖÉèÖúó£¬ÓÖÒýÈëÁ˸üÏȽøµÄ˼·£ºÌõ¼þÉèÖá£
¶ÔÓÚµ¥´¿µÄSetter£º<Setter Property=¡±Height¡± Value=¡±22¡±>À´Ëµ£¬º¬ÒådzÏÔÒ×¶®£ºÉèÖø߶ÈΪ22¡£Ìõ¼þÉèÖõĺ¬ÒåÊÇ£¬ÔÚijÖÖÌõ¼þÏ£¬È¥ÉèÖÃij¸ö¶ÔÏóµÄij¸öÖµ¡£
WPFÒýÈëÁËTrigger£¨´¥·¢Æ÷£©À´´¥·¢Õâ¸öÌõ¼þ£¬ËüµÄд·¨ÊÇ£º
<Style TargetType="{x:Type Button}" x:Key="ButtonStyle"> 2: <Setter Property="Width" Value="60"/> 3: <Style.Triggers> 4: <Trigger Property="IsMouseOver" Value="True"> 5: <Setter Property="Width" Value="80"/> 6: </Trigger> 7: </Style.Triggers> 8: </Style>
|
ÕâÀïTriggerµÄº¬ÒåÊÇ£¬ÔÚButtonµÄIsMouseOverÊôÐÔ±»ÉèÖÃΪTrueµÄÌõ¼þÏ£¬ÉèÖÃButtonµÄ¿í¶È£¨Width£©Îª80¡£
ÔÚStyleÖУ¬²»ÐèÒªÖ¸¶¨Setter×÷ÓõĶÔÏó£¨TargetName£©£¬Ä¬ÈÏ×÷ÓõĶÔÏó¾ÍÊÇʹÓøÃStyleµÄ¿Ø¼þ¡£Trigger£¬×÷Ϊ´¥·¢Æ÷£¬µ±´¥·¢Ê±ÉèÖÿí¶ÈΪ80£¬µ±IsMouseOverÊôÐÔΪFalse£¬Ò²¾ÍÊÇ´¥·¢Ìõ¼þʧЧʱ£¬¿í¶È»Øµ½Ä¬ÈÏSetterµÄÉèÖÃÖµ60¡£
WPF¶¨ÒåÁËÎåÖÖTriggerÀ´×÷Ϊ´¥·¢Ìõ¼þ£¬·Ö±ðÊÇ£ºTrigger£¬DataTrigger£¬MultiTrigger£¬MultiDataTrigger£¬EventTrigger£¬ËûÃǵĴ¥·¢Ìõ¼þ·Ö±ðÊÇ£º
1.Trigger£ºÒԿؼþµÄÊôÐÔ×÷Ϊ´¥·¢Ìõ¼þ£¬ÈçÇ°ÃæµÄIsMouseOverΪTrueµÄʱºò´¥·¢¡£
2.DataTrigger£ºÒԿؼþDataContextµÄÊôÐÔ×÷Ϊ´¥·¢Ìõ¼þ¡£
3.MultiTrigger£ºÒԿؼþµÄ¶à¸öÊôÐÔ×÷Ϊ´¥·¢Ìõ¼þ¡£
4.MultiDataTrigger£ºÒԿؼþDataContextµÄ¶à¸öÊôÐÔ×÷Ϊ´¥·¢Ìõ¼þ¡£
5.EventTrigger£ºÒÔRoutedEvent×÷Ϊ´¥·¢Ìõ¼þ£¬µ±Ö¸¶¨µÄ·ÓÉʼþRaiseʱ´¥·¢¡£
¹ØÓÚÕâ5ÖÖTriggerµÄ¾ßÌåʹÓã¬Çë²Î¼ûMSDN£¬ÕâÀï¾Í²»Ïêϸ½éÉÜÁË¡£
Implicit Style
ÉÏÃæµÄÀý×ÓÖУ¬¶¼ÊÇʹÓÃStaticResourceÀ´ÉèÖÃStyleµÄ£¬µ±È»£¬ÄãÒ²¿ÉÒÔʹÓÃDynamicResourceÀ´ÉèÖÃStyle¡£ÕâÁ½ÖÖ·½Ê½¶¼ÐèÒªÄãÔÚXAML»òÕߺǫ́´úÂëÖÐÊÖ¶¯×¢Ã÷£¬ÎªÁËʹÓ÷½±ã£¬WPFÌá³öÁËÒþʽ£¨Implicit£©
StyleµÄ·½Ê½ÔÊÐí×Ô¶¯ÉèÖÃStyleµ½¿Ø¼þ£¬È磺
<Window> 2: <Grid> 3: <Grid.Resources> 4: <Style TargetType="{x:Type Button}"> 5: <Setter Property="Height" Value="22"/> 6: <Setter Property="Width" Value="60"/> 7: </Style> 8: </Grid.Resources> 9: <Button x:Name="button1" Style="{x:Null}"/> 10: <Button x:Name="button2" Margin="156,144,286,145" /> 11: <Button x:Name="button3" Margin="196,144,0,145" /> 12: </Grid> 13: </Window>
|
ÔÚGirdµÄResourceÖж¨ÒåStyleʱ£¬Ã»ÓиøStyleÆðÃû×Ö£¨Key£©£¬Õâ¸öStyle»á×Ô¶¯Ó¦ÓÃÔÚGridµÄËùÓÐ×ÓButtonÖУ¬Èç¹ûÏñbutton1Ò»ÑùÔÚButtonÖÐÏÔʽ¶¨ÒåÁËStyle£¨ÕâÀïÉèÖÃÁËÒ»¸ö¿ÕÖµNull£©£¬ÄÇôÕâÖÖÒþʽ£¨Implicit£©µÄStyle»á²»Æð×÷Óá£
ÉîÈëStyle
StyleÊÇÒ»¸ö²»´íµÄ¸ÅÄ×÷Ϊһ¸öPresentationµÄ¿ò¼Ü£¬°ÑUI¶ÔÏóµÄ½á¹¹£¬ÑùʽºÍÐÐΪ·ÖÀëÕâÊÇÒ»ÖֺܺõÄÉè¼Æ¡£StyleÒ²±È½ÏÈÝÒ×ÉÏÊÖ£¬ÏñËüµÄÒþʽ£¨Implicit£©StyleµÄÉè¼ÆÒ²ÊÇË®µ½Çþ³ÉµÄÏë·¨£¬µ«Êµ¼ÊʹÓÃÖÐÒ²»á³öÏÖһЩÎÊÌâ¡£ÕâЩÎÊÌâÔÚWPFÖÐÒ²»á¾³£Óö¼û£º¸ÅÄî²»´í£¬ÃèÊö¼òµ¥£¬Ç°¾°ÃÀºÃ£¬BugÏ¡Ææ¹Å¹Ö£¬Òª°ÑÕâЩÎÊÌâ˵Çå³þ£¬¾ÍÒª´Ó¸ù±¾À´¿´£¬StyleÊǸöʲô¶«Î÷£¿
°´ÕÕͨ³£µÄÏë·¨£¬StyleÓ¦¸ÃÀàËÆÓÚÒ»¸öDictionary<string, object>
setters£¬Ô¤´æÁËÊôÐÔµÄÃû×ÖºÍÔ¤ÉèÖµ£¬È»ºó×÷Óõ½UI¶ÔÏóÉÏ¡£WPFÔÚStyle´¦µÄÏë·¨ºÜ¶à£¬Î§ÈÆ×ż¸¸ö¹Ø¼ü¼¼ÊõÒ²¼ÓÈëÁ˺ܶ๦ÄÜ£¬ÏêϸµÄ½éÉÜһϣº
Style & Dependency Property
Dependency Property£¨¼ò³ÆDP£©ÊÇWPFµÄºËÐÄ£¬Style¾ÍÊÇ»ùÓÚDependency
PropertyµÄ£¬¹ØÓÚDPµÄÄÚÄ»£¬Çë²Î¼ûÉîÈëWPF--ÒÀÀµÊôÐÔ¡£StyleÖеÄSetter¾ÍÊÇ×÷ÓÃÔÚDPÉϵģ¬Èç¹ûÄãÔڿؼþÖж¨ÒåÁËÒ»¸öCLRÊôÐÔ£¬StyleÊDz»ÄÜÉèÖõġ£Dependency
PropertyÉè¼ÆµÄ¾«ËèÔÚÓÚ°Ñ×ֶεĴæÈ¡ºÍ¶ÔÏó£¨Dependency Object£©°þÀ뿪£¬Ò»¸öÊôÐÔÖµÄÚ²¿Óöà¸ö×Ö¶ÎÀ´´æ´¢£¬¸ù¾ÝȡֵÌõ¼þµÄÓÅÏȼ¶À´¾ö¶¨µ±Ç°ÊôÐÔÓ¦¸ÃÈ¡Äĸö×ֶΡ£
Dependency PropertyȡֵÌõ¼þµÄÓÅÏȼ¶ÊÇ£¨´ÓÉϵ½ÏÂÓÅÏȼ¶´ÓµÍµ½¸ß£©£º
public enum BaseValueSource 2: { 3: Unknown, 4: Default, 5: Inherited, 6: DefaultStyle, 7: DefaultStyleTrigger, 8: Style, 9: TemplateTrigger, 10: StyleTrigger, 11: ImplicitStyleReference, 12: ParentTemplate, 13: ParentTemplateTrigger, 14: Local 15: }
|
¶ÔÓÚÒ»¸ö¾ßÌåÀý×ÓÀ´Ëµ£º
<Window> 2: <Window.Resources> 3: <Style TargetType="{x:Type Button}" x:Key="ButtonStyle"> 4: <Setter Property="Width" Value="60"/> 5: <Style.Triggers> 6: <Trigger Property="IsMouseOver" Value="True"> 7: <Setter Property="Width" Value="80"/> 8: </Trigger> 9: </Style.Triggers> 10: </Style> 11: </Window.Resources> 12: <Grid> 13: <Button x:Name="button1" Style="{StaticResource ButtonStyle}"
Background="{DynamicResource brush}" Width="20"/> 14: </Grid> 15: </Window>
|
µÚ4ÐÐÓÃStyleµÄSetterÉèÖÃWidth=60£¬Õâ¸öÓÅÏȼ¶ÊÇStyle£»µÚ6Ðе±IsMouseOverΪTrueʱÉèÖÃWidth=80£¬Õâ¸öÓÅÏȼ¶ÊÇStyleTrigger£»µÚ13ÐÐʹÓÃStyleµÄButton¶¨ÒåWidth=20£¬Õâ¸öÓÅÏȼ¶ÊÇLocal¡£Local¾ßÓÐ×î¸ßµÄÓÅÏȼ¶£¬ËùÒÔ¼´Ê¹Êó±êÒÆµ½ButtonÉÏ£¬µÚ6ÐеÄTriggerÒ²»áÒòΪÓÅÏȼ¶²»¹»¸ß¶ø²»Æð×÷Óá£Èç¹ûÈ¥µôÁ˵Ú13ÐÐÖеÄWidth=20£¬ÄÇôÊó±êÒÆµ½ButtonÉÏʱWidth»á±äΪ80£¬Êó±êÒÆ¿ªºó»á»Øµ½µÚ4ÐеÄÉèÖõÄ60À´¡£
Style & FrameworkElement
Style×÷Ϊһ¸öÊôÐÔ¶¨ÒåÔÚFrameworkElementÉÏ£¬ËùÓм̳Ð×ÔFrameworkElementµÄ¿Ø¼þ¶¼¿ÉÒÔʹÓÃStyle¡£FrameworkElement¶¨ÒåÁ˶à¸öStyle£ºStyle£¬ThemeStyle£¬FocusVisualStyle£º
1.FocusVisualStyle£ºÊǵ±¿Ø¼þ»ñµÃ¼üÅ̽¹µãʱ£¬ÏÔʾÔÚÍâÃæµÄÒ»¸öÐéÏß¿ò£¬Õâ¸öStyle²¢Ã»ÓÐÖ±½Ó×÷ÓÃÔÚ¶ÔÓ¦µÄFrameworkElementÉÏ£¬¶øÊǵ±¿Ø¼þ»ñµÃ¼üÅ̽¹µãʱʹÓÃAdornLayer´´½¨ÁËÒ»¸öеÄControl£¬È»ºóÔÙÕâ¸öControlÉÏʹÓÃFocusVisualStyle£¬ÔÙ°ÑËüÕÚ¸ÇÔÚ¶ÔÓ¦µÄFrameworkElementÉÏÐγÉÒ»¸öÐéÏß¿òµÄЧ¹û¡£
2.Style£º¾ÍÊÇÎÒÃÇÇ°ÃæÒ»Ö±ÉèÖõÄStyle¡£
3.ThemeStyle£ºÕâÀïÒýÈëÁËÒ»¸öThemeµÄ¸ÅÄ¾ßÌåÀ´Ì¸Ò»ÏÂËü¡£
Windows¶¨Á˺ܶàTheme£¨Ö÷Ì⣩£¬Äã¿ÉÒÔÔÚ¿ØÖÆÃæ°åÖÐÇл»Theme£¬Èçͼ£º

×îÉÏÃæµÄÁ½ÅŶ¼ÊôÓÚAeroÖ÷Ì⣬µ±´ÓAeroÖ÷ÌâÇл»µ½Windows ClassicÖ÷Ìâºó£¬ÈÎÎñÀ¸£¬´°¿ÚÒÔ¼°´°¿ÚÄڵĿؼþÍâ¹Û¶¼»á·¢Éú±ä»¯¡£ÎªÁ˸üºÃµÄÇл»Ö÷Ì⣬WPFÒýÈëÁËThemeStyleÕâ¸ö¸ÅÄî¡£µ±ÎÒÃÇʹÓÃVS2010µÄÄ£°åÉú³ÉÒ»¸ö×Ô¶¨Òå¿Ø¼þ£¨Custom
Control£©ºó£¬»á×Ô¶¯Ìí¼ÓÒ»¸öThemesµÄÎļþ¼ÐÒÔ¼°Ò»¸öGeneric.xamlµÄÎļþ£¬Èçͼ£º

ÕâÀïµÄAero.NormalColor.xamlÊÇÊÖ¶¯Ìí¼ÓµÄ£¬ÏÈÂÔÈ¥²»Ì¸£¬À´Ì¸Ì¸¿Ø¼þ£¨Control£©µÄĬÈÏÑùʽ¡£
WPFĬÈÏÌṩÁËºÜ¶à¿Ø¼þ£¬Button£¬ListBox£¬TabControlµÈµÈ£¬ÎÒÃÇʹÓÃÕâЩ¿Ø¼þʱ£¬ÊÇûÓÐÖ¸¶¨ËüµÄÑùʽ£¨Style£©µÄ£¬WPFΪÎÒÃÇÌṩÁËĬÈÏStyle£¬Õâ¸öĬÈÏStyleÊÇÓëWindowsÖ÷ÌâÏà¹ØµÄ¡£±ÈÈçÎÒÃÇÇл»WindowsµÄÖ÷Ìâ´ÓAeroµ½Classic£¬WPF´°¿ÚÀïµÄ¿Ø¼þÍâ¹ÛÒ²»á·¢Éú±ä»¯¡£ÕâЩĬÈϵÄStyleÊÇÒÔResourceDictionaryµÄÐÎʽ±£´æÔÚPresentationFramework.Aero.dll£¬PresentationFramework.Classic.dllµÈdllÖеģ¬ÕâÀïµÄÃüÃû¹æÔòÊÇ£º³ÌÐò¼¯Ãû³Æ+ThemeÃû³Æ+.dll¡£
ÄÇôWPFÓÖÊÇÈçºÎ¸ù¾ÝWindowsµÄThemeÕÒµ½¶ÔÓ¦µÄThemeStyleÄØ£¿WPFÌá³öÁËThemeInfoÕâ¸öAttributeÀ´Ö¸¶¨ThemeÐÅÏ¢¡£ThemeInfoÒ»°ã¶¨ÒåÔÚProperties/AssemblyInfo.csÖУ¬È磺
1: [assembly: ThemeInfo( 2: ResourceDictionaryLocation.SourceAssembly, 3: ResourceDictionaryLocation.SourceAssembly) 4: )]
|
ThemeInfoÓÐÁ½¸ö²ÎÊý£¬µÚÒ»¸ö²ÎÊýÖ¸µÄÊÇThemeResource£¬µÚ¶þ¸ö²ÎÊýÖ¸µÄÊÇGenericResource£¬ËüÃǵÄÀàÐÍÊÇResourceDictionaryLocation£º
public enum ResourceDictionaryLocation 2: { 3: None = 0, 4: SourceAssembly = 1, 5: ExternalAssembly = 2, 6: }
|
ResourceDictionaryLocationµÄNoneÖ¸²»´æÔÚ¶ÔÓ¦µÄResource£¬SourceAssemblyÖ¸¸Ã³ÌÐò¼¯£¨Assembly£©ÖдæÔÚ¶ÔÓ¦µÄResource£¬ExternalAssemblyÖ¸¶ÔÓ¦µÄResource±£´æÔÚÍⲿµÄ³ÌÐò¼¯£¨Assembly£©ÖУ¬Õâ¸öÍⲿ³ÌÐò¼¯µÄ²éÕÒ¹æÔò¾ÍÊÇÎÒÃÇÇ°Ãæ¿´µ½µÄ£º³ÌÐò¼¯Ãû³Æ+ThemeÃû³Æ+.dll¡£
¶ÔÓÚÒ»¸ö¿Ø¼þ£¬ÎÞÂÛÊÇϵͳ×Ô´øµÄ¿Ø¼þ»¹ÊÇÎÒÃÇ×Ô¶¨ÒåµÄ¿Ø¼þ£¬WPFÆô¶¯Ê±¶¼»áͨ¹ýµ±Ç°WindowsϵͳµÄTheme²éÕÒËü¶ÔÓ¦µÄThemeStyle¡£Õâ¸ö²éÕÒ¹æÔòÊÇ£º
1.ÏÈͨ¹ý¿Ø¼þµÄÀàÐÍ£¨Type£©ÕÒµ½Ëü¶ÔÓ¦µÄ³ÌÐò¼¯£¨Assembly£©£¬È»ºó»ñÈ¡³ÌÐò¼¯ÖеÄThemeInfo£¬¿´¿´ËüµÄThemeResourceºÍGenericResourceÔÚÄÄÀï¡£Èç¹ûThemeResourceµÄÖµ²»ÊÇNone£¬ÏµÍ³»á¶ÁÈ¡µ½ThemeResource¶ÔÓ¦µÄResourceDictionary£¬ÔÚÕâ¸öResourceDictionaryÖвéÕÒÊÇ·ñ¶¨ÒåÁËTargetType={x:Type
¿Ø¼þÀàÐÍ}£¬Èç¹ûÓУ¬°Ñ¿Ø¼þµÄThemeStyleÖ¸¶¨ÎªÕâ¸öStyle¡£
2.Èç¹ûµÚÒ»²½µÄ²éÕÒʧ°Ü£¬ÄÇôGenericResourceÅÉÉÏÓ󡣬GenericÕâ¸ö´Ê±íʾһ°ã¡£WPF»á²é¿´ThemeInfoµÄµÚ¶þ¸ö²ÎÊýGenericResourceÀ´²éÕÒËüµÄThemeStyle£¬²éÕÒ¹æÔòͬµÚÒ»²½£¬Èç¹û²éÕҳɹ¦£¬°ÑÕâ¸öStyleÖ¸¶¨Îª¿Ø¼þµÄThemeStyle¡£
ÈÎÒâÒ»¸ö¿Ø¼þ£¬Èç¹û²»ÏÔʽָ¶¨ËüµÄStyle£¬²¢ÇҲ鲻µ½Ä¬ÈϵÄThemeStyle£¬Õâ¸ö¿Ø¼þÊÇûÓÐÍâ¹ÛµÄ¡£ÎªÁ˱à³Ì·½±ã£¬µ±ÎÒÃÇʹÓÃVSÌí¼Ó×Ô¶¨Òå¿Ø¼þʱ£¬VSĬÈϰïÎÒÃÇÉú³ÉÁËGeneric.xaml£¬Èç¹ûÎÒÃÇÏ£Íû×Ô¶¨ÒåµÄ¿Ø¼þÒ²ÒªÖ§³ÖϵͳµÄTheme±ä»¯£¬¿ÉÒÔÔÚThemesÕâ¸öÎļþ¼ÐϼÓÈë¶ÔÓ¦µÄResourceDictionary£¬±ÈÈçÉÏÃæµÄAero.NormalColor.xaml£¬²¢ÇÒÖ¸¶¨³ÌÐò¼¯ThemeInfoµÄµÚÒ»¸ö²ÎÊýΪSourceAssembly£¬±íÃ÷¸Ã³ÌÐò¼¯Ö§³ÖϵͳTheme±ä»¯²¢ÇÒ¶ÔÓ¦µÄ×ÊÔ´ÎļþÔڸóÌÐò¼¯ÖС£µ±È»£¬ResourceDictionaryÒ»¶¨Òª·ÅÔÚThemesÎļþ¼ÐÏ£¬ÒòΪWPF²éÕÒResourceDictionaryʱʹÓõÄÊÇÀàËÆ£º
string relativePackUriForResources = "/" + 2: themeAssemblyName.FullName + 3: ";component/themes/" + 4: themeName + "." + 5: colorScheme + ".xaml";
|
ÕâÑùµÄ·½·¨¡£
Style & ResourceDictionary
Ç°ÃæÌáµ½Á˺ܶà´ÎResourceDictionary£¬¹ØÓÚWPFµÄResourceϵͳ£¬ÒÔºóÔÙÀ´Ï¸Ì¸¡£WPFµÄResourceϵͳʹÓÃResourceDictionaryÀ´´¢´æResource£¬ResourceDictionary£¬¹ËÃû˼Ò壬ҲÊÇÒ»¸öDictionary£¬¼ÈÈ»ÊÇDictionary£¬¾ÍÊǰ´¼ü/Öµ¶ÔÀ´´æ´¢µÄ¡£ÎÒÃÇ×îÇ°ÃæÔÚWindowµÄResourceÖд´½¨Styleʱ£¬Ö¸¶¨ÁËStyle¶ÔÓ¦µÄ¼üÖµ£¨x:Key£©£¬ºóÃæÓÖÓÃStaticResourceÀ´ÒýÓÃÕâ¸ö¼üÖµ¡£
Èç¹ûÔÚResourceDictionaryÖÐÌí¼ÓÒ»¸ö¶ÔÏóButton£¬²»Ö¸¶¨ËüµÄ¼üÖµ£¨x:Key£©£¬ÊDz»ÄÜͨ¹ý±àÒëµÄ¡£ÎÒÃÇÇ°Ãæ½éÉܵÄÒþʽ£¨Implicit£©Style£¬Ö»Ö¸¶¨ÁËÒ»¸öTargetType={x:Type
ÀàÐÍ}£¬²¢Ã»ÓÐÖ¸¶¨¼üÖµ£¬ÎªÊ²Ã´Ëü¿ÉÒÔͨ¹ý±àÒëÄØ£¿
¶ÔÓÚÔÚResourceDictionaryÖÐÌí¼ÓStyle£¬Èç¹ûÎÒÃÇûÓÐÖ¸¶¨¼üÖµ£¨x:Key£©£¬WPF»áĬÈϰïÎÒÃÇÉú³É¼üÖµ£¬Õâ¸ö¼üÖµ²»ÊÇÒ»¸öString£¬¶øÊÇÒ»¸öÀàÐÍobject£¨¾ßÌåÀ´ËµÊÇTypeʵÀý£©£¬Ò²¾ÍÊÇ˵Ï൱ÓÚ£º
<Style TargetType="{x:Type Button}" x:Key="{x:Type Button}">
|
ºóÃæµÄx:Key¿ÉÒÔÊ¡ÂÔµô¡£
AppliationÒÔ¼°FrameworkElementÀà¶¼¶¨ÒåÁËResourcesÊôÐÔ£¬ÄÚ²¿¶¼³ÖÓÐÒ»¸öResourceDictionary£¬Resource²éÕÒ×ñѵÄ×î»ù±¾ÔÔòÊǾͽüÔÔò£¬È磺
<Window> 2: <Window.Resources> 3: <Style TargetType="{x:Type Button}"> 4: <Setter Property="Background" Value="Yellow"/> 5: </Style> 6: <Style TargetType="{x:Type ToggleButton}" x:Key="toggleBtnStyle"> 7: <Setter Property="Background" Value="Red"/> 8: </Style> 9: </Window.Resources> 10: <StackPanel> 11: <StackPanel.Resources> 12: <Style TargetType="{x:Type Button}"> 13: <Setter Property="Background" Value="Blue"/> 14: </Style> 15: <Style TargetType="{x:Type ToggleButton}" x:Key="toggleBtnStyle"> 16: <Setter Property="Background" Value="Green"/> 17: </Style> 18: </StackPanel.Resources> 19: <ToggleButton Width="80" Height="20" Style="{DynamicResource toggleBtnStyle}"/> 20: <Button Width="80" Height="20" Content="button2" Click="Button_Click"/> 21: </StackPanel> 22: </Window>
|
WindowºÍStackPanelµÄResourcesÖж¼·Ö±ð¶¨ÒåÁËtoggleBtnStyleÒÔ¼°ÒþʽStyle£¨Button£©£¬¸ù¾Ý¾Í½üÔÔò£¬StackPanelÄÚ²¿µÄToggleButtonºÍButton»áÓ¦ÓÃStackPanelµÄResource¶ø²»»áʹÓÃWindowµÄ¡£
Style Merge
ÕâÀïÒªÌáµ½±¾ÆªµÄÖØµãÒ²ÊDz»±»ÈË×¢ÒâÈ´¾³£³ö´íµÄµØ·½£¬StyleµÄºÏ²¢£¨Merge£©¡£
Ç°ÃæÌáµ½Á˺ܶàStyle£¬ThemeStyle£¬Style£¬ÒþʽStyle¡£ÎÒÃÇÌá¹ý£¬StyleÏ൱ÓÚÒ»¸öÊôÐÔÖµµÄÅú´¦Àí£¬ÄÇô¶ÔÓÚÒ»¸öÊôÐÔ£¬Ö»ÄÜÓÐÒ»¸öÔ¤ÉèÖµ¶ø²»Äܶà¸ö£¬ÕâЩStyleÔÚÔËÐÐʱҪ½øÐкϲ¢£¬È»ºó×÷ÓÃÔÚFrameworkElementÉÏ¡£
StyleµÄºÏ²¢£¬Òª·ÖÁ½²½½øÐУº
1.ÕÒµ½ËùÓÐStyle¡£
2.È·¶¨StyleµÄÓÅÏȼ¶£¬¸ù¾ÝÓÅÏȼ¶À´ºÏ²¢Style¡£
ÒÔButtonÀ´Ëµ£º
1.Èç¹ûµ±Ç°WindowsµÄThemeÊÇAero£¬Æô¶¯ºó»á´ÓPresentationFramework.Aero.dllÖÐÕÒµ½¶ÔÓ¦µÄThemeStyle¡£
2.Èç¹ûÔÚButtonÉÏʹÓÃStaticResource»òÕßDynamicResourceÖ¸¶¨ÁËStyle£¬»áͨ¹ý¼üÖµÔÚResourceϵͳÖÐÕÒµ½¶ÔÓ¦µÄStyle¡£
3.Èç¹ûûÓÐÔÚButtonÉÏÏÔʽָ¶¨Style£¬»áͨ¹ýResourceϵͳ²éÕÒÒþʽStyle£¨x:Type
Button£©¡£
4.µÚ¶þ²½ºÍµÚÈý²½ÊÇÅÅËûµÄ£¬ÕâÁ½²½Ö»ÄÜÈ·¶¨Ò»¸öStyle£¬È»ºó°ÑÕâ¸öStyleºÍThemeStyle½øÐкϲ¢£¨Merge£©µÃµ½Button×îÖÕµÄЧ¹û¡£
ÏȴӺϲ¢À´Ëµ£¬ÏÔʽ»òÕßÒþʽStyleµÄÓÅÏȼ¶ÊǸßÓÚThemeStyleµÄ£¬Èç¹ûStyleºÍThemeStyleµÄSetterÖж¼¶ÔͬһÊôÐÔ½øÐÐÁËÔ¤É裬ÄÇô»áÈ¡StyleÀïÃæµÄSetter¶øºöÂÔThemeStyle¡£ÕâÀï±È½ÏÌØÊâµÄÊÇEventSetter£¬EventSetterʹÓõÄÊÇRoutedEvent£¬Èç¹ûÁ½¸öStyleµÄEventSetter¶Ôͬһ¸öRoutedEvent½øÐÐÁËÉèÖã¬Á½¸ö¶¼»á×¢²áµ½RoutedEventÉÏ¡£
Ç°Ãæ¿´µ½£¬ÏÔʽºÍÒþʽStyleÊÇÅÅËûµÄ£¬Á½ÕßÖ»ÄÜȡһ£¬ÔÚʵ¼ÊÏîÄ¿ÖУ¬ÔÚÈ«¾Ö¶¨ÒåºÃButtonµÄ»ù±¾Ñùʽ£¬È»ºó¾ßÌåʹÓÃÉÏÔÙ¸ù¾Ý»ù±¾Ñùʽ×öÒ»Ð©ÌØÊâ´¦Àí£¬ÕâÖÖÐèÇóÊǺܳ£¼ûµÄ¡£ÎªÁ˽â¾öÕâÖÖÐèÇó£¬StyleÌá³öÁËBasedOnÊôÐÔ£¬À´±íʾ¼Ì³Ð¹ØÏµ£¬È磺
<Window> 2: <Window.Resources> 3: <Style TargetType="{x:Type Button}"> 4: <Setter Property="Width" Value="80"/> 5: <Setter Property="Height" Value="20"/> 6: <EventSetter Event="Click" Handler="btnBase_Click"/> 7: </Style> 8: <Style TargetType="{x:Type ButtonBase}" x:Key="toggleBtnStyle"> 9: <Setter Property="Width" Value="80"/> 10: <Setter Property="Height" Value="20"/> 11: <Setter Property="Background" Value="Red"/> 12: </Style> 13: </Window.Resources> 14: <StackPanel> 15: <StackPanel.Resources> 16: <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}"> 17: <Setter Property="Background" Value="Blue"/> 18: <EventSetter Event="Click" Handler="btn_Click"/> 19: </Style> 20: <Style TargetType="{x:Type ToggleButton}"
x:Key="toggleBtnStyle" BasedOn="{StaticResource toggleBtnStyle}"> 21: <Setter Property="Background" Value="Green"/> 22: </Style> 23: </StackPanel.Resources> 24: <ToggleButton Style="{DynamicResource toggleBtnStyle}"/> 25: <Button Content="button2"/> 26: </StackPanel> 27: </Window>
|
ΪÁ˸üÇåÎúµÄ½âÊÍ£¬¸ø³öÁËÒ»¸ö²»Ì«³£¼ûµÄÀý×Ó¡£µÚ16Ðд´½¨ÁËÒ»¸öÒþʽStyle£¨Button£©£¬ËüµÄBasedOnÊôÐÔÈÔÈ»ÊÇÒþʽStyle£¨Button£©£¬Resourceϵͳ»áÏòÉϲéÕÒÕÒµ½WindowµÄResorcesÖеÄÒþʽStyle£¨Button£©£¬È»ºó°ÑÁ½Õߺϲ¢¡£¶ÔÓÚͬһ¸öResourceDictionary£¬ÊDz»ÔÊÐíÓÐÖØ¸´¼üÖµµÄ£¬StackPanelºÍWindow¸÷Óи÷×ÔµÄResourceDictionary£¬ËûÃǵļüÖµ²»ÊܸÉÈÅ£¬²éÕÒʱ»áͨ¹ý¾Í½üÔÔòÀ´ÕÒµ½ÓÅÏȼ¶×î¸ßµÄResource¡£µÚ20ÐÐToggleButtonµÄÀý×ÓºÍButtonÊÇÒ»ÑùµÄ£¬Ö»ÊÇËü²éÕÒµ½µÄµÚ8ÐÐtoggleBtnStyleµÄTargetStyleÊÇButtonBase£¬ButtonBaseÊÇToggleButtonµÄ»ùÀ࣬BasedOnÊôÐÔÒ²¿ÉÒÔ×÷Óá£
WPFµÄStyle»úÖÆÊÇÒ»¸öÃܷ⣨Seal£©»úÖÆ£¬ËüµÄÊéд·½Ê½ºÜÁé»î£¬¿ÉÒÔÖ§³ÖºÏ²¢µÈ£¬µ±×îºóºÏ²¢ºó£¬Style¾Í±»Ãܷ⣨Seal£©£¬ÄÚ²¿µÄSetterµÈ²»ÔÊÐíÔÙ±»Ð޸ġ£ÕâÖÖÃÜ·âµÄÉè¼ÆÓÐËüµÄµÀÀí£¬µ«ÔÚStyleµÄ¶¯Ì¬ÐÔÉϾÍÉÔÏÔ²»×ã¡£
ÒÔ×Ô¶¨Òå¿Ø¼þΪÀý£¬×Ô¶¨ÒåÒ»¸öButton£¬Ãû×Ö½ÐMyButton£¬Ëü¼Ì³Ð×ÔButton£¬ÔÚ×Ô¶¨Òå¿Ø¼þÖУ¬¾³£¿ÉÒÔ¿´µ½ÕâÑùµÄ´úÂ룺
static MyButton() 2: { 3: DefaultStyleKeyProperty.OverrideMetadata(typeof(MyButton), new FrameworkPropertyMetadata(typeof(MyButton))); 4: }
|
ÕâÀï³öÏÖÁËDefaultStyle£¬Õâ¸öÊÇWPF¶ÔThemeStyleµÄÁíÒ»¸ö˵·¨£¬ThemeStyle¾ÍÊÇÓÃÀ´È·¶¨Ä¬ÈϵÄStyleµÄ£¬ºóÀ´°üÀ¨BaseValueSourceÖÐҲʹÓÃÁËDefaultStyleÀ´±íʾThemeStyle¡£ÔÚMyButtonµÄ¾²Ì¬º¯ÊýÖÐÖØÔØDefaultStyleKeyPropertyÄÚ²¿MetadataµÄº¬ÒåÊǸæËßWPFϵͳ£¬²éÕÒMyButtonµÄThemeStyleʹÓõļüÖµ´Ó{x:Type
Button}±»¸Ä³ÉÁË{x:Type MyButton}¡£
Èç¹ûÏñÉÏÊö´úÂëÒ»ÑùÐÞ¸ÄÁËDefaultStyleKeyProperty£¬ÄÇôÐèÒªÎÒÃÇÔÚThemes/Generic.xamlÖж¨ÒåºÃMyButtonµÄĬÈÏ£¨Theme£©Style£¬·ñÔòMyButtonÊÇûÓÐÍâ¹ÛµÄ£¬ÒòΪ²éÕÒThemeStyleµÄ¼üÖµÒѾ±»Ð޸ģ¬PresentationFramework.Aero.dllµÈdllÖÐÊÇûÓж¨Òå{x:Type
MyButton}µÄ¡£
Ç°ÃæÊǹØÓÚThemeStyleµÄÓ÷¨£¬ÄÇô»Øµ½ÒþʽStyleÉÏÀ´£¬Èç¹ûÎÒÃÇÔÚApplicationµÄResourcesÖж¨ÒåÁËButtonµÄÒþʽStyle£¨TargetType={x:Type
Button}£©£¬¼´Ê¹Ã»ÓÐÏÔʽÉèÖÃMyButtonµÄStyle£¬ËùÓеÄMyButton¿Ø¼þÒ²²»»áʹÓÃÕâ¸öÒþʽStyleµÄ¡£ÐèÒªÄãÔÚApplicationµÄResourcesÖУ¬ÔÚ¶¨ÒåButtonÒþʽStyleµÄÏÂÃæ¶¨Òå
<Style TargetType="{x:Type local:MyButton}" BasedOn="{StaticResource {x:Type Button}}"/>
|
ÕâÀï¾Í»Øµ½StyleµÄºÏ²¢£¨Merge£©ÉÏÀ´ÁË£¬StyleµÄMergeÊǺܻù±¾£¨ºÜɵ£©µÄºÏ²¢£¨Merge£©£¬Ëü²»¾ß±¸AutoÐÔ¡£¾ßÌåÀ´Ëµ£¬¾ÍÊÇ£º
1.»ùÀà¿Ø¼þµÄÒþʽStyle²»»á×÷Óõ½ÅÉÉúÀà¿Ø¼þÉÏ¡£
2.ÏñÇ°ÃæÔÚWindowºÍStackPanelÖзֱð¶¨ÒåÁËÒþʽStyle£¨Button£©£¬ÕâÁ½¸öÒþʽStyle²»»áÖÇÄܺϲ¢ºóÔÙ×÷Óõ½ButtonÉÏ£¬¶øÊÇͨ¹ý¾Í½üÔÔòֻѡÆäÒ»¡£
3.StyleµÄBasedOnÊôÐÔÖ»Ö§³ÖStaticResource·½Ê½ÒýÓã¬ÒòΪStyle¼Ì³Ð×ÔDispatcherObject¶ø²»ÊÇDependencyObject£¬DynamicResourceÖ»Ö§³ÖDP¡£
ÕâЩÎÊÌâ¶¼ÐèҪͨ¹ýStyleµÄBasedOnÀ´½â¾ö£¬ÒòΪBasedOnÓõÄÊǾ²Ì¬ÒýÓã¨StaticResource£©£¬µ±ÒþʽStyle·¢Éú±ä»¯Ê±¾ÍÓÐÂé·³ÁË¡£
»»·ô
UI³ÌÐòµÄ»»·ôÊǺÜìŵÄÍæÒ⣬»»·ô·ÖÁ½ÖÖ£º1£¬¸ü»»Õû¸ö¿Ø¼þµÄStyle£»2£¬¸ü»»StyleÖеÄÑÕÉ«»Ë¢£¨Brush£©¡£ºóÕßµÄʵÏֺܼòµ¥£¬¶¨ÒåºÃÑÕÉ«»Ë¢µÄ×ÊÔ´Îļþ£¨ResourceDictionary£©£¬Ê¹ÓûˢµÄʱºòʹÓÃDynamicResource°ó¶¨£¬»»·ôµÄʱºòÌæ»»»Ë¢µÄ×ÊÔ´Îļþ¾Í¿ÉÒÔÁË¡£
ºÜ¶à¹«Ë¾¶¼ÓÐ×Ô¼ºÆ¤·ô¿â£¬ÕâЩƤ·ô¿âÒ»°ã¶¼ÊÇÒþʽµÄStyle£¬¶¨ÒåÁËËùÓпؼþµÄÒþʽStyle£¬Ê¹ÓÃʱ°ÑÕâ¸öƤ·ô×ÊÔ´Mergeµ½ApplicationµÄResourcesÖС£»»·ôʱ°Ñ¾ÉµÄƤ·ô×ÊÔ´´ÓApplicationµÄResourcesÖÐɾ³ý£¬Ìæ»»³ÉÐÂµÄÆ¤·ô×ÊÔ´ResourceDictionary¡£
ÕâÖÖ×ö·¨ºÜºÃÀí½â£¬µ«ÊÇÅöµ½StyleµÄBasedOnÊôÐԾͲ»Æð×÷ÓÃÁË£¬BasedOnÊôÐÔʹÓÃÊÇStaticResource£¬ÊǾ²Ì¬µÄÒ»´ÎÐԵġ£ÐÂµÄÆ¤·ô¿â±»Ìí¼Óµ½Application×ÊÔ´Îļþºó£¬Èç¹ûÔÚApplicationµÄ×ÊÔ´ÎļþÖÐÒѾ¶¨Òå¹ý<Style
TargetType=¡°{x:Type Button}¡± BasedOn=¡°{StaticResource
{x:Type Button}}¡±/>ÕâÑùÒþʽµÄStyle£¬¿Ø¼þÊDz»»á¸üÐÂÆ¤·ôµÄ¡£Èç¹ûÓÐÕâ·½ÃæµÄÐèÇó£¬ÐèÒªÊÖ¶¯ºÏ²¢£¨Merge£©StyleÀ´½â¾öÎÊÌ⣬ÀàËÆ£º
public static void Merge(this Style style, Style otherStyle) 2: { 3: foreach (SetterBase currentSetter in otherStyle.Setters) 4: { 5: style.Setters.Add(currentSetter); 6: } 7: 8: foreach (TriggerBase currentTrigger in otherStyle.Triggers) 9: { 10: style.Triggers.Add(currentTrigger); 11: } 12: 13: foreach (object key in otherStyle.Resources.Keys) 14: { 15: style.Resources[key] = otherStyle.Resources[key]; 16:
|
ÕâÀﻹÐèÒª¼ÓÉÏһЩÌõ¼þÅжϣ¬ÒÔ¼°¾ö¶¨ÊÇ·ñÒªµÝ¹éºÏ²¢otherStyleµÄBasedOn£¬»Øµ½Ç°Ã棬³ÌÐòÐèҪʹÓÃDynamicResourceÀ´¼àÌýApplication×ÊÔ´ÖÐÒþʽStyleµÄ±ä»¯£¬ÓÃÒ»¸ö¸½¼ÓÊôÐÔÀ´½â¾ö£º
public static readonly DependencyProperty AutoMergeStyleProperty = 2: DependencyProperty.RegisterAttached("AutoMergeStyle", typeof(Type), typeof(Behavior), 3: new FrameworkPropertyMetadata((Type)null, 4: new PropertyChangedCallback(OnAutoMergeStyleChanged))); 5: 6: private static void OnAutoMergeStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 7: { 8: if (e.OldValue == e.NewValue) 9: { 10: return; 11: } 12: 13: FrameworkElement control = d as FrameworkElement; 14: if (control == null) 15: { 16: throw new NotSupportedException("AutoMergeStyle can only used in FrameworkElement"); 17: } 18: 19: Type type = e.NewValue as Type; 20: if (type != null) 21: { 22: control.SetResourceReference(Behavior.BaseOnStyleProperty, type); 23: } 24: else 25: { 26: control.ClearValue(Behavior.BaseOnStyleProperty); 27: } 28: }
|
SetResourceReferenceÊÇXAMLÖÐDynamicResourceµÄ´úÂë±íʾ£¬Ï൱ÓÚBehavior.BaseOnStyle={DynamicResource
type}¡£¶Ô¿Ø¼þʹÓÃSetResourceReference£¬¼àÌýµÄ¼üÖµÊÇtype£¬¼àÌýµÄÊôÐÔÊÇÒ»¸öÎÒÃÇ×Ô¶¨ÒåµÄ¸½¼ÓÊôÐÔBaseOnStyleProperty¡£µ±»»·ôÌæ»»ApplicationµÄ×ÊÔ´Îļþʱ£¬BaseOnStyleÊôÐÔ±»¸üУ¬ÔÚBaseOnStylePropertyµÄChangedʼþÖпÉÒÔ¶ÁÈ¡¿Ø¼þµÄStyleÊôÐÔºÍеÄThemeStyle£¬µ÷ÓÃMerge·½·¨MergeÁ½ÕßÈ»ºóÔÙÉèÖõ½¿Ø¼þµÄStyleÊôÐÔÉÏ¡£
×ܽá
WPFÖÐStyleµÄÉè¼ÆÖйæÖоأ¬°ÑUI¶ÔÏóÑùʽºÍ½á¹¹·ÖÀëÊÇËüµÄ×î³õÏë·¨£¬ÆäÖÐÒ²¼ÓÈëÁËTriggerµÈһЩºÃµÄÉè¼Æ£¬µ«ÔÚʹÓÃÖл¹ÊÇ»á³öÏÖһЩÎÊÌ⣬Ëü±¾ÉíÒ²²»ÊÇÄÇôÖÇÄÜÍêÃÀ¡£Ï£ÍûÅóÓÑÃǶ¼ÄÜ´ÓÄÚµ½ÍâµÄ¿´´ýStyle£¬¸üºÃµÄÍæ×ªËü¡£
|