/// 按钮类型 /// public enum _wpf ui框架">
当前位置:   article > 正文

WPF UI框架界面开发教程(十一)

wpf ui框架

在项目开发中,按钮有多种形态,UI样式文件比较散乱,不方便维护和扩展,比如按钮有文本、图标+文本、动画、链接等几种类型。每种类型写一个样式,所以在按钮中增加枚举类型,判断是哪种类型按钮,加载相对应用控件模板,假如是链接按钮,设置local:ButtonFrameHelper.Type ="Link"就完成样式切换。

WPF UI框架界面开发教程

  1. /// <summary>
  2. /// 按钮类型
  3. /// </summary>
  4. public enum ButtonType
  5. {
  6. /// <summary>
  7. /// 文本
  8. /// </summary>
  9. [Description("文本")]
  10. Text = 0,
  11. /// <summary>
  12. /// 图标和文本
  13. /// </summary>
  14. [Description("图标和文本")]
  15. IconText = 1,
  16. /// <summary>
  17. /// 动画
  18. /// </summary>
  19. [Description("动画")]
  20. Animation = 2,
  21. /// <summary>
  22. /// 链接
  23. /// </summary>
  24. [Description("链接")]
  25. Link = 3,
  26. }

1:首先添加button类型枚举参数。
 

  1. public class ButtonFrameHelper : DependencyObject
  2. {
  3. /// <summary>
  4. /// 按钮类型
  5. /// </summary>
  6. public static readonly DependencyProperty TypeProperty = DependencyProperty.Register(
  7. "Type", typeof(ButtonType), typeof(ButtonFrameHelper), new PropertyMetadata(default(ButtonType)));
  8. public static ButtonType GetType(DependencyObject property)
  9. {
  10. return (ButtonType)property.GetValue(TypeProperty);
  11. }
  12. public static void SetType(DependencyObject property, ButtonType value)
  13. {
  14. property.SetValue(TypeProperty, value);
  15. }
  16. /// <summary>
  17. /// 按钮图标
  18. /// </summary>
  19. public Geometry Icon
  20. {
  21. get { return (Geometry)GetValue(IconProperty); }
  22. set { SetValue(IconProperty, value); }
  23. }
  24. public static readonly DependencyProperty IconProperty =
  25. DependencyProperty.Register("Icon", typeof(Geometry), typeof(ButtonFrameHelper));
  26. }

2:添加Button类依赖属性,Type是Button枚举类型,通过设置此参数来切换,Icon是图标+文本按钮需要此属性。

下面把说明样式代码:

  1. <Style TargetType="{x:Type Button}">
  2. <Setter Property="Foreground" Value="{StaticResource ForegroundLightBrush}"/>
  3. <Setter Property="BorderThickness" Value="0"/>
  4. <Setter Property="Template" Value="{DynamicResource TextButton}"/>
  5. <Style.Triggers>
  6. <Trigger Property="local:ButtonFrameHelper.Type" Value="Text">
  7. <Setter Property="Margin" Value="0,10,0,0"/>
  8. <Setter Property="Padding" Value="50,10"/>
  9. <Setter Property="Background" Value="{StaticResource WordOrangeBrush}"/>
  10. <Setter Property="FontSize" Value="{StaticResource Nb.FontSize.30}"/>
  11. <Setter Property="local:BusyFrameAnimation.IsBusy" Value="False"/>
  12. <Setter Property="Template" Value="{DynamicResource TextButton}"/>
  13. </Trigger>
  14. <Trigger Property="local:ButtonFrameHelper.Type" Value="IconText">
  15. <Setter Property="Width" Value="150"/>
  16. <Setter Property="Height" Value="60"/>
  17. <Setter Property="Background" Value="{StaticResource WordOrangeBrush}"/>
  18. <Setter Property="FontSize" Value="{StaticResource Nb.FontSize.30}"/>
  19. <Setter Property="HorizontalContentAlignment" Value="Center" />
  20. <Setter Property="VerticalContentAlignment" Value="Center" />
  21. <Setter Property="local:ButtonFrameHelper.Icon" Value="{DynamicResource Icon-Checked}"/>
  22. <Setter Property="local:BusyFrameAnimation.IsBusy" Value="False"/>
  23. <Setter Property="Template" Value="{DynamicResource IconTextButton}"/>
  24. </Trigger>
  25. <Trigger Property="local:ButtonFrameHelper.Type" Value="Animation">
  26. <Setter Property="Margin" Value="0,10,0,0"/>
  27. <Setter Property="Padding" Value="50,10"/>
  28. <Setter Property="Background" Value="{StaticResource WordOrangeBrush}"/>
  29. <Setter Property="FontSize" Value="{StaticResource Nb.FontSize.30}"/>
  30. <Setter Property="local:BusyFrameAnimation.IsBusy" Value="False"/>
  31. <Setter Property="Template" Value="{DynamicResource AnimationButton}"/>
  32. </Trigger>
  33. <Trigger Property="local:ButtonFrameHelper.Type" Value="Link">
  34. <Setter Property="Background" Value="Transparent"/>
  35. <Setter Property="BorderThickness" Value="0"/>
  36. <Setter Property="FontSize" Value="{StaticResource Nb.FontSize.20}"/>
  37. <Setter Property="Margin" Value="0,10"/>
  38. <Setter Property="Padding" Value="50,10"/>
  39. <Setter Property="Cursor" Value="Hand"/>
  40. <Setter Property="Template" Value="{DynamicResource LinkButton}"/>
  41. </Trigger>
  42. </Style.Triggers>
  43. </Style>
  44. <!--链接类型按钮-->
  45. <ControlTemplate x:Key="LinkButton" TargetType="{x:Type Button}">
  46. <Border x:Name="border"
  47. CornerRadius="10"
  48. BorderBrush="{TemplateBinding BorderBrush}"
  49. BorderThickness="{TemplateBinding BorderThickness}"
  50. Background="{TemplateBinding Background}"
  51. SnapsToDevicePixels="True">
  52. <TextBlock Text="{TemplateBinding Content}"
  53. Focusable="False"
  54. FontFamily="{TemplateBinding FontFamily}"
  55. FontSize="{TemplateBinding FontSize}"
  56. HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
  57. Margin="{TemplateBinding Padding}"
  58. SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
  59. VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
  60. </Border>
  61. <ControlTemplate.Triggers>
  62. <Trigger Property="IsMouseOver" Value="True">
  63. <Setter Property="Foreground" Value="{StaticResource WordOrangeBrush}"/>
  64. </Trigger>
  65. <Trigger Property="IsEnabled" Value="False">
  66. <Setter Property="Foreground" Value="{StaticResource ForegroundDarkBrush}"/>
  67. </Trigger>
  68. </ControlTemplate.Triggers>
  69. </ControlTemplate>
  70. <!--文本类型按钮-->
  71. <ControlTemplate x:Key="TextButton" TargetType="{x:Type Button}">
  72. <Border x:Name="border"
  73. CornerRadius="10"
  74. BorderBrush="{TemplateBinding BorderBrush}"
  75. BorderThickness="{TemplateBinding BorderThickness}"
  76. Background="{TemplateBinding Background}"
  77. SnapsToDevicePixels="True">
  78. <Grid>
  79. <TextBlock Text="{TemplateBinding Content}"
  80. Visibility="{TemplateBinding local:BusyFrameAnimation.IsBusy, Converter={cv:BoolenToVisiblityConverter}}"
  81. Focusable="False"
  82. FontFamily="{TemplateBinding FontFamily}"
  83. FontSize="{TemplateBinding FontSize}"
  84. HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
  85. Margin="{TemplateBinding Padding}"
  86. SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
  87. VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
  88. </Grid>
  89. </Border>
  90. <ControlTemplate.Triggers>
  91. <EventTrigger RoutedEvent="MouseEnter">
  92. <BeginStoryboard>
  93. <Storyboard>
  94. <ColorAnimation To="{StaticResource WordBlue}" Duration="0:0:0.3" Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Color"/>
  95. </Storyboard>
  96. </BeginStoryboard>
  97. </EventTrigger>
  98. <EventTrigger RoutedEvent="MouseLeave">
  99. <BeginStoryboard>
  100. <Storyboard>
  101. <ColorAnimation From="{StaticResource WordBlue}" Duration="0:0:0.3" Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Color"/>
  102. </Storyboard>
  103. </BeginStoryboard>
  104. </EventTrigger>
  105. <Trigger Property="IsEnabled" Value="False">
  106. <Setter Property="Background" TargetName="border" Value="{StaticResource ForegroundDarkBrush}"/>
  107. </Trigger>
  108. </ControlTemplate.Triggers>
  109. </ControlTemplate>
  110. <!--图标和文本类型按钮-->
  111. <ControlTemplate x:Key="IconTextButton" TargetType="{x:Type Button}">
  112. <Border x:Name="border"
  113. CornerRadius="10"
  114. BorderBrush="{TemplateBinding BorderBrush}"
  115. BorderThickness="{TemplateBinding BorderThickness}"
  116. Background="{TemplateBinding Background}"
  117. SnapsToDevicePixels="True">
  118. <Grid>
  119. <StackPanel Orientation="Horizontal" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}">
  120. <Viewbox x:Name="IconBox" Width="{TemplateBinding FontSize}" Height="{TemplateBinding FontSize}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
  121. <Path Data="{TemplateBinding local:ButtonFrameHelper.Icon}" Fill="{TemplateBinding Foreground}" Stretch="Fill"></Path>
  122. </Viewbox>
  123. <Grid x:Name="IconSplit" Width="5"></Grid>
  124. <TextBlock Text="{TemplateBinding Content}"
  125. Focusable="False"
  126. FontFamily="{TemplateBinding FontFamily}"
  127. FontSize="{TemplateBinding FontSize}"
  128. HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
  129. Margin="{TemplateBinding Padding}"
  130. SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
  131. VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
  132. </StackPanel>
  133. </Grid>
  134. </Border>
  135. <ControlTemplate.Triggers>
  136. <EventTrigger RoutedEvent="MouseEnter">
  137. <BeginStoryboard>
  138. <Storyboard>
  139. <ColorAnimation To="{StaticResource WordBlue}" Duration="0:0:0.3" Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Color"/>
  140. </Storyboard>
  141. </BeginStoryboard>
  142. </EventTrigger>
  143. <EventTrigger RoutedEvent="MouseLeave">
  144. <BeginStoryboard>
  145. <Storyboard>
  146. <ColorAnimation From="{StaticResource WordBlue}" Duration="0:0:0.3" Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Color"/>
  147. </Storyboard>
  148. </BeginStoryboard>
  149. </EventTrigger>
  150. <Trigger Property="IsEnabled" Value="False">
  151. <Setter Property="Background" TargetName="border" Value="{StaticResource ForegroundDarkBrush}"/>
  152. </Trigger>
  153. <Trigger Property="local:ButtonFrameHelper.Icon" Value="{x:Null}">
  154. <Setter TargetName="IconBox" Property="Visibility" Value="Collapsed" />
  155. <Setter TargetName="IconSplit" Property="Visibility" Value="Collapsed" />
  156. </Trigger>
  157. </ControlTemplate.Triggers>
  158. </ControlTemplate>
  159. <!--动画类型按钮-->
  160. <ControlTemplate x:Key="AnimationButton" TargetType="{x:Type Button}">
  161. <Border x:Name="border"
  162. CornerRadius="10"
  163. BorderBrush="{TemplateBinding BorderBrush}"
  164. BorderThickness="{TemplateBinding BorderThickness}"
  165. Background="{TemplateBinding Background}"
  166. SnapsToDevicePixels="True">
  167. <Grid>
  168. <TextBlock Text="{TemplateBinding Content}"
  169. Visibility="{TemplateBinding local:BusyFrameAnimation.IsBusy, Converter={cv:BoolenToVisiblityConverter}}"
  170. Focusable="False"
  171. FontFamily="{TemplateBinding FontFamily}"
  172. FontSize="{TemplateBinding FontSize}"
  173. HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
  174. Margin="{TemplateBinding Padding}"
  175. SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
  176. VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
  177. <Label Style="{DynamicResource SpinningLabel}"
  178. FontSize="{TemplateBinding FontSize}"
  179. Foreground="{TemplateBinding Foreground}"
  180. HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
  181. VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
  182. Visibility="{TemplateBinding local:BusyFrameAnimation.IsBusy, Converter={cv:BoolenToVisiblityConverter}, ConverterParameter=True}"/>
  183. </Grid>
  184. </Border>
  185. <ControlTemplate.Triggers>
  186. <EventTrigger RoutedEvent="MouseEnter">
  187. <BeginStoryboard>
  188. <Storyboard>
  189. <ColorAnimation To="{StaticResource WordBlue}" Duration="0:0:0.3" Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Color"/>
  190. </Storyboard>
  191. </BeginStoryboard>
  192. </EventTrigger>
  193. <EventTrigger RoutedEvent="MouseLeave">
  194. <BeginStoryboard>
  195. <Storyboard>
  196. <ColorAnimation From="{StaticResource WordBlue}" Duration="0:0:0.3" Storyboard.TargetName="border" Storyboard.TargetProperty="Background.Color"/>
  197. </Storyboard>
  198. </BeginStoryboard>
  199. </EventTrigger>
  200. <Trigger Property="IsEnabled" Value="False">
  201. <Setter Property="Background" TargetName="border" Value="{StaticResource ForegroundDarkBrush}"/>
  202. </Trigger>
  203. </ControlTemplate.Triggers>
  204. </ControlTemplate>

TriggerProperty="local:ButtonFrameHelper.Type"Value="Text" 设置是文本类型,<SetterProperty="Template"Value="{DynamicResource TextButton}"/> 设置模板动态加载资源 TextButton,其它类型以此类推。

最后添加page页测试这几种按钮类型

  1. <Page x:Class="Fashion.Word.Pages.ControlPage"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  6. xmlns:local="clr-namespace:Fashion.Word"
  7. mc:Ignorable="d"
  8. d:DesignHeight="450" d:DesignWidth="600"
  9. Title="ControlPage">
  10. <Border>
  11. <Grid>
  12. <StackPanel
  13. VerticalAlignment="Center"
  14. HorizontalAlignment="Center"
  15. TextBlock.TextAlignment="Center">
  16. <Border Background="{StaticResource ForegroundLightBrush}"
  17. CornerRadius="10"
  18. Padding="15,50,15,15"
  19. Width="330"
  20. Margin="50,50,50,0">
  21. <StackPanel >
  22. <Button local:ButtonFrameHelper.Type ="Text"
  23. Content="文本"
  24. HorizontalAlignment="Center"/>
  25. <Button Grid.Row="2" Margin="0,10,0,0"
  26. local:ButtonFrameHelper.Type ="IconText"
  27. Content="图标"
  28. HorizontalAlignment="Center"/>
  29. <Button Grid.Row="2" Margin="0,10,0,0"
  30. local:ButtonFrameHelper.Type ="Animation"
  31. Content="动画"
  32. HorizontalAlignment="Center"/>
  33. </StackPanel>
  34. </Border>
  35. <Button local:ButtonFrameHelper.Type ="Link"
  36. Command="{Binding RegisterCommand}"
  37. Content="免费注册新帐户."
  38. HorizontalAlignment="Center">
  39. </Button>
  40. </StackPanel>
  41. </Grid>
  42. </Border>
  43. </Page>

这样就不需要找有哪些样式button。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/790695?site
推荐阅读
相关标签
  

闽ICP备14008679号