WPF - 簡單的UI框架 - 靈活的按鈕
阿新 • • 發佈:2020-05-13
按鈕樣式自定義演示:
原始碼分享地址:https://github.com/DuelWithSelf/WPFEffects
效果:
<Style TargetType="{x:Type CustomFrms:NormalMenu}"> <Setter Property="IconWidth" Value="12"/> <Setter Property="IconHeight" Value="12"/> <Setter Property="FocusBackground" Value="{StaticResource ColorBrush.LightWhite}"/> <Setter Property="IconBrush" Value="White"/> <Setter Property="Foreground" Value="White"/> <Setter Property="FocusBrush" Value="White"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type CustomFrms:IconMenu}"> <Grid x:Name="Part_GdContainer" Background="Transparent"> <Border x:Name="Part_BdrContainer" Background="{TemplateBinding Background}" Padding="5" CornerRadius="{Binding Path=CornerRadius,RelativeSource={RelativeSource TemplatedParent}}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> <Path x:Name="Part_Icon" Width="{Binding Path=IconWidth,RelativeSource={RelativeSource TemplatedParent}}" Height="{Binding Path=IconHeight,RelativeSource={RelativeSource TemplatedParent}}" Data="{Binding Path=IconData,RelativeSource={RelativeSource TemplatedParent}}" Fill="{Binding Path=IconBrush,RelativeSource={RelativeSource TemplatedParent}}" Stretch="Fill" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Padding="{Binding Path=Padding,RelativeSource={RelativeSource TemplatedParent}}" TextAlignment="Center" FontSize="{Binding Path=FontSize,RelativeSource={RelativeSource TemplatedParent}}" x:Name="Part_Content" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="{Binding Path=TextMargin,RelativeSource={RelativeSource TemplatedParent}}" Foreground="{Binding Path=Foreground,RelativeSource={RelativeSource TemplatedParent}}" Text="{Binding Path=Text,RelativeSource={RelativeSource TemplatedParent}}" FontFamily="{Binding Path=FontFamily,RelativeSource={RelativeSource TemplatedParent}}"/> </StackPanel> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter TargetName="Part_Icon" Property="Fill" Value="{Binding Path=FocusBrush,RelativeSource={RelativeSource TemplatedParent}}"/> <Setter TargetName="Part_BdrContainer" Property="Background" Value="{Binding Path=FocusBackground,RelativeSource={RelativeSource TemplatedParent}}"/> <Setter TargetName="Part_BdrContainer" Property="BorderBrush" Value="{Binding Path=FocusBackground,RelativeSource={RelativeSource TemplatedParent}}"/> <Setter TargetName="Part_Content" Property="Foreground" Value="{Binding Path=FocusBrush,RelativeSource={RelativeSource TemplatedParent}}"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter TargetName="Part_GdContainer" Property="Opacity" Value="0.1"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="Part_Icon" Property="Fill" Value="{Binding Path=FocusBrush,RelativeSource={RelativeSource TemplatedParent}}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
public class IconMenu : Control { public string IconData { get { return (string)base.GetValue(IconDataProperty); } set { base.SetValue(IconDataProperty,value); } } public static readonly DependencyProperty IconDataProperty = DependencyProperty.Register("IconData",typeof(string),typeof(IconMenu),new FrameworkPropertyMetadata("")); public double IconWidth { get { return (double)base.GetValue(IconWidthProperty); } set { base.SetValue(IconWidthProperty,value); } } public static readonly DependencyProperty IconWidthProperty = DependencyProperty.Register("IconWidth",typeof(double),new FrameworkPropertyMetadata(60d)); public double IconHeight { get { return (double)base.GetValue(IconHeightProperty); } set { base.SetValue(IconHeightProperty,value); } } public static readonly DependencyProperty IconHeightProperty = DependencyProperty.Register("IconHeight",new FrameworkPropertyMetadata(60d)); public Brush IconBrush { get { return (Brush)base.GetValue(IconBrushProperty); } set { base.SetValue(IconBrushProperty,value); } } public static readonly DependencyProperty IconBrushProperty = DependencyProperty.Register("IconBrush",typeof(Brush),new FrameworkPropertyMetadata(Brushes.Black)); public Brush FocusBrush { get { return (Brush)base.GetValue(FocusBrushProperty); } set { base.SetValue(FocusBrushProperty,value); } } public static readonly DependencyProperty FocusBrushProperty = DependencyProperty.Register("FocusBrush",new FrameworkPropertyMetadata(Brushes.Black)); public Brush FocusBackground { get { return (Brush)base.GetValue(FocusBackgroundProperty); } set { base.SetValue(FocusBackgroundProperty,value); } } public static readonly DependencyProperty FocusBackgroundProperty = DependencyProperty.Register("FocusBackground",new FrameworkPropertyMetadata(Brushes.Transparent)); public bool IsSelected { get { return (bool)base.GetValue(IsSelectedProperty); } set { base.SetValue(IsSelectedProperty,value); } } public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register("IsSelected",typeof(bool),new FrameworkPropertyMetadata(false)); public CornerRadius CornerRadius { get { return (CornerRadius)base.GetValue(CornerRadiusProperty); } set { base.SetValue(CornerRadiusProperty,value); } } public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.Register("CornerRadius",typeof(CornerRadius),new FrameworkPropertyMetadata(new CornerRadius(0))); static IconMenu() { DefaultStyleKeyProperty.OverrideMetadata(typeof(IconMenu),new FrameworkPropertyMetadata(typeof(IconMenu))); } }
public class NormalMenu : IconMenu { public string Text { get { return (string)base.GetValue(TextProperty); } set { base.SetValue(TextProperty,value); } } public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text",typeof(NormalMenu),new FrameworkPropertyMetadata("")); public Thickness TextMargin { get { return (Thickness)base.GetValue(TextMarginProperty); } set { base.SetValue(TextMarginProperty,value); } } public static readonly DependencyProperty TextMarginProperty = DependencyProperty.Register("TextMargin",typeof(Thickness),new FrameworkPropertyMetadata(new Thickness(5,0,0))); static NormalMenu() { DefaultStyleKeyProperty.OverrideMetadata(typeof(NormalMenu),new FrameworkPropertyMetadata(typeof(NormalMenu))); } }