亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

WPF自定義控件和樣式之自定義按鈕(Button)

2019-10-29 21:06:01
字體:
來源:轉載
供稿:網友

一、前言

程序界面上的按鈕多種多樣,常用的就這幾種:普通按鈕、圖標按鈕、文字按鈕、圖片文字混合按鈕。本文章記錄了不同樣式類型的按鈕實現方法。下面話不多說了,來一起看看詳細的介紹吧。

二、固定樣式的按鈕

固定樣式的按鈕一般在臨時使用時或程序的樣式比較固定時才會使用,按鈕整體樣式不需要做大的改動。

2.1 普通按鈕-扁平化風格

先看效果:

wpf,自定義button,自定義按鈕,button,樣式

定義Button的樣式,詳見代碼:

<Style x:Key="BtnInfoStyle" TargetType="Button">   <Setter Property="Width" Value="70"/>   <Setter Property="Height" Value="25"/>   <Setter Property="Foreground" Value="White"/>   <Setter Property="BorderThickness" Value="0"/>   <Setter Property="Background" Value="#43a9c7"/>   <Setter Property="Template">    <Setter.Value>     <ControlTemplate TargetType="Button">      <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">       <TextBlock Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>      </Border>      <ControlTemplate.Triggers>       <Trigger Property="IsMouseOver" Value="True">        <Setter TargetName="border" Property="Background" Value="#2f96b4"/>       </Trigger>       <Trigger Property="IsPressed" Value="True">        <Setter TargetName="border" Property="Background" Value="#2a89a4"/>       </Trigger>      </ControlTemplate.Triggers>     </ControlTemplate>   </Setter.Value>  </Setter></Style>

引用方法:

<Grid Background="White">  <StackPanel Orientation="Horizontal" Margin="10" VerticalAlignment="Top">   <Button Style="{StaticResource BtnInfoStyle}" Content="信息" Margin="5 0"/></Grid>

上述代碼實現了Button按鈕的扁平化樣式,如果你想調整顏色風格,通過修改Background的值可實現默認顏色,鼠標經過顏色以及鼠標按下顏色。

2.2 圖標按鈕

先看效果:

wpf,自定義button,自定義按鈕,button,樣式

Button樣式的代碼和扁平化Button差不多,只是把TextBlock控件替換成了Image控件,另外需要設置Button默認的背景色為透明。廢話不多說看代碼:

<Style x:Key="BtnImageStyle1" TargetType="Button">   <Setter Property="Cursor" Value="Hand"/>   <Setter Property="Template">    <Setter.Value>     <ControlTemplate TargetType="Button">      <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">       <Image x:Name="Img" VerticalAlignment="Center" HorizontalAlignment="Center" Source="/Images/button1.png" Stretch="None"/>      </Border>      <ControlTemplate.Triggers>       <Trigger Property="IsMouseOver" Value="True">        <Setter TargetName="Img" Property="Source" Value="/Images/button1.png"/>       </Trigger>       <Trigger Property="IsPressed" Value="True">        <Setter TargetName="Img" Property="Source" Value="/Images/button1.png"/>       </Trigger>      </ControlTemplate.Triggers>     </ControlTemplate>   </Setter.Value>  </Setter> </Style>

這里的button1.png需要自己準備圖片資源,IsMouseOver和IsPressed的圖片資源可自己替換,替換之后能有更豐富的效果呈現。

2.3 圖標文字混合按鈕

效果:

wpf,自定義button,自定義按鈕,button,樣式

實現代碼:

<Style x:Key="BtnImgTxtStyle1" TargetType="Button">  <Setter Property="Foreground" Value="#555"/>  <Setter Property="Template">    <Setter.Value>     <ControlTemplate TargetType="Button">      <Border>       <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">        <Image Source="Images/adshut.png" Stretch="None"/>        <TextBlock x:Name="Txt" Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>       </StackPanel>      </Border>      <ControlTemplate.Triggers>       <Trigger Property="IsMouseOver" Value="True">        <Setter Property="Foreground" Value="#333333" TargetName="Txt"/>       </Trigger>      </ControlTemplate.Triggers>     </ControlTemplate>   </Setter.Value>  </Setter> </Style>

2.4 文字按鈕和2.3中的圖標文字按鈕樣式差不多,只需要把Image控件去掉就行。

三、復用性高的按鈕

要想實現復用性高的按鈕,就必須新建自定義控件。下面這個實例通過自定義控件實現上述所有效果,并且可以隨意更改風格。

首先在項目中右鍵-添加-新建項-自定義控件。

wpf,自定義button,自定義按鈕,button,樣式

新建自定義控件之后,添加依賴屬性。代碼如下:

public class ButtonEx : Button {  static ButtonEx()  {   DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonEx), new FrameworkPropertyMetadata(typeof(ButtonEx)));  }  public ButtonType ButtonType  {   get { return (ButtonType)GetValue(ButtonTypeProperty); }   set { SetValue(ButtonTypeProperty, value); }  }  public static readonly DependencyProperty ButtonTypeProperty =   DependencyProperty.Register("ButtonType", typeof(ButtonType), typeof(ButtonEx), new PropertyMetadata(ButtonType.Normal));  public ImageSource Icon  {   get { return (ImageSource)GetValue(IconProperty); }   set { SetValue(IconProperty, value); }  }  public static readonly DependencyProperty IconProperty =   DependencyProperty.Register("Icon", typeof(ImageSource), typeof(ButtonEx), new PropertyMetadata(null));  public CornerRadius CornerRadius  {   get { return (CornerRadius)GetValue(CornerRadiusProperty); }   set { SetValue(CornerRadiusProperty, value); }  }  public static readonly DependencyProperty CornerRadiusProperty =   DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(ButtonEx), new PropertyMetadata(new CornerRadius(0)));  public Brush MouseOverForeground  {   get { return (Brush)GetValue(MouseOverForegroundProperty); }   set { SetValue(MouseOverForegroundProperty, value); }  }  public static readonly DependencyProperty MouseOverForegroundProperty =   DependencyProperty.Register("MouseOverForeground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());  public Brush MousePressedForeground  {   get { return (Brush)GetValue(MousePressedForegroundProperty); }   set { SetValue(MousePressedForegroundProperty, value); }  }  public static readonly DependencyProperty MousePressedForegroundProperty =   DependencyProperty.Register("MousePressedForeground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());  public Brush MouseOverBorderbrush  {   get { return (Brush)GetValue(MouseOverBorderbrushProperty); }   set { SetValue(MouseOverBorderbrushProperty, value); }  }  public static readonly DependencyProperty MouseOverBorderbrushProperty =   DependencyProperty.Register("MouseOverBorderbrush", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());  public Brush MouseOverBackground  {   get { return (Brush)GetValue(MouseOverBackgroundProperty); }   set { SetValue(MouseOverBackgroundProperty, value); }  }  public static readonly DependencyProperty MouseOverBackgroundProperty =   DependencyProperty.Register("MouseOverBackground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());  public Brush MousePressedBackground  {   get { return (Brush)GetValue(MousePressedBackgroundProperty); }   set { SetValue(MousePressedBackgroundProperty, value); }  }  public static readonly DependencyProperty MousePressedBackgroundProperty =   DependencyProperty.Register("MousePressedBackground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata()); } public enum ButtonType {  Normal,  Icon,  Text,  IconText }

為不同類型按鈕設置樣式,代碼如下:

<Style TargetType="{x:Type local:ButtonEx}">  <Style.Triggers>   <Trigger Property="ButtonType" Value="Normal">    <Setter Property="Background" Value="#43a9c7"/>    <Setter Property="MouseOverBackground" Value="#2f96b4"/>    <Setter Property="MousePressedBackground" Value="#2a89a4"/>    <Setter Property="Foreground" Value="White"/>    <Setter Property="MouseOverForeground" Value="White"/>    <Setter Property="MousePressedForeground" Value="White"/>    <Setter Property="BorderBrush" Value="Transparent"/>    <Setter Property="BorderThickness" Value="0"/>    <Setter Property="Template">     <Setter.Value>      <ControlTemplate TargetType="{x:Type local:ButtonEx}">       <Border x:Name="border" Background="{TemplateBinding Background}" CornerRadius="{TemplateBinding CornerRadius}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" SnapsToDevicePixels="True">        <TextBlock x:Name="txt" Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>       </Border>       <ControlTemplate.Triggers>        <Trigger Property="IsMouseOver" Value="True">         <Setter TargetName="border" Property="Background" Value="{Binding MouseOverBackground,RelativeSource={RelativeSource TemplatedParent}}"/>         <Setter TargetName="txt" Property="Foreground" Value="{Binding MouseOverForeground,RelativeSource={RelativeSource TemplatedParent}}"/>         <Setter TargetName="border" Property="BorderBrush" Value="{Binding MouseOverBorderbrush,RelativeSource={RelativeSource TemplatedParent}}"/>        </Trigger>        <Trigger Property="IsPressed" Value="True">         <Setter TargetName="border" Property="Background" Value="{Binding MousePressedBackground,RelativeSource={RelativeSource TemplatedParent}}"/>         <Setter TargetName="txt" Property="Foreground" Value="{Binding MousePressedForeground,RelativeSource={RelativeSource TemplatedParent}}"/>                 </Trigger>       </ControlTemplate.Triggers>      </ControlTemplate>     </Setter.Value>    </Setter>   </Trigger>   <Trigger Property="ButtonType" Value="Icon">    <Setter Property="Cursor" Value="Hand"/>    <Setter Property="Template">     <Setter.Value>      <ControlTemplate TargetType="{x:Type local:ButtonEx}">       <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">        <Image x:Name="Img" VerticalAlignment="Center" HorizontalAlignment="Center" Source="{TemplateBinding Icon}" Stretch="None"/>       </Border>       <ControlTemplate.Triggers>        <Trigger Property="IsMouseOver" Value="True">         <Setter Property="Opacity" Value="0.8"/>        </Trigger>        <Trigger Property="IsPressed" Value="True">         <Setter Property="Opacity" Value="0.9"/>        </Trigger>       </ControlTemplate.Triggers>      </ControlTemplate>     </Setter.Value>    </Setter>   </Trigger>   <Trigger Property="ButtonType" Value="Text">    <Setter Property="Cursor" Value="Hand"/>    <Setter Property="Foreground" Value="#002c99"/>    <Setter Property="MouseOverForeground" Value="#FF2c99"/>    <Setter Property="MousePressedForeground" Value="#002c99"/>    <Setter Property="Template">     <Setter.Value>      <ControlTemplate TargetType="{x:Type local:ButtonEx}">       <TextBlock x:Name="txt" Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>       <ControlTemplate.Triggers>        <Trigger Property="IsMouseOver" Value="True">         <Setter Property="Foreground" Value="{Binding MouseOverForeground,RelativeSource={RelativeSource TemplatedParent}}" TargetName="txt"/>        </Trigger>        <Trigger Property="IsPressed" Value="True">         <Setter Property="Foreground" Value="{Binding MousePressedForeground,RelativeSource={RelativeSource TemplatedParent}}" TargetName="txt"/>        </Trigger>       </ControlTemplate.Triggers>      </ControlTemplate>     </Setter.Value>    </Setter>   </Trigger>   <Trigger Property="ButtonType" Value="IconText">    <Setter Property="Cursor" Value="Hand"/>    <Setter Property="Foreground" Value="#555"/>    <Setter Property="MouseOverForeground" Value="#555"/>    <Setter Property="MousePressedForeground" Value="#555"/>    <Setter Property="Template">     <Setter.Value>      <ControlTemplate TargetType="{x:Type local:ButtonEx}">       <Border>        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">         <Image Source="{TemplateBinding Icon}" Stretch="None"/>         <TextBlock x:Name="Txt" Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>        </StackPanel>       </Border>       <ControlTemplate.Triggers>        <Trigger Property="IsMouseOver" Value="True">         <Setter Property="Foreground" Value="{Binding MouseOverForeground,RelativeSource={RelativeSource TemplatedParent}}" TargetName="Txt"/>        </Trigger>        <Trigger Property="IsPressed" Value="True">         <Setter Property="Foreground" Value="{Binding MousePressedForeground,RelativeSource={RelativeSource TemplatedParent}}" TargetName="Txt"/>        </Trigger>       </ControlTemplate.Triggers>      </ControlTemplate>     </Setter.Value>    </Setter>   </Trigger>  </Style.Triggers>  </Style>

然后就可以引用該控件了:

<Grid>  <WrapPanel>   <local:ButtonEx Content="信息" Width="75" Height="25" Margin="10" ButtonType="Normal"/>   <local:ButtonEx Icon="/Images/button1.png" Margin="10" ButtonType="Icon"/>   <local:ButtonEx Content="文字按鈕" Margin="10" ButtonType="Text"/>   <local:ButtonEx Content="圖文按鈕" Icon="/Images/adshut.png" Margin="10" ButtonType="IconText"/>  </WrapPanel> </Grid>

效果如下:

wpf,自定義button,自定義按鈕,button,樣式

至此已經完成Button控件的擴展功能,如果想要添加動畫或者設置圖標的位置和邊距等,可以自己另外添加依賴屬性來擴展。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久精品免费视频| 亚洲精品日韩欧美| 国产成人精品免费视频| 亚洲一区二区三区xxx视频| 成人日韩在线电影| 日韩免费黄色av| 91久久国产精品91久久性色| 亚洲人成五月天| 欧美午夜激情视频| 欧美日韩第一视频| 国产亚洲欧洲高清| 日韩中文字在线| 日本欧美精品在线| 国产a级全部精品| 亚洲国产精品悠悠久久琪琪| 在线视频欧美日韩精品| 一区二区在线视频| 91精品在线观看视频| 国产精品xxx视频| 欧美日韩成人在线播放| 日本国产精品视频| 久热精品视频在线观看一区| 国产精品日韩av| 欧美激情精品在线| 欧美日韩成人网| 亚洲一区二区三区久久| 精品国内自产拍在线观看| 日韩有码在线观看| 欧美性资源免费| 欧美亚洲午夜视频在线观看| 久久综合免费视频| 久久久久久一区二区三区| 国产成人精品免费久久久久| 69久久夜色精品国产69乱青草| 日韩av黄色在线观看| 久久精品电影网站| 精品偷拍一区二区三区在线看| 亚洲第一福利在线观看| 亚洲色图偷窥自拍| 成人免费淫片视频软件| 国产精品久久久久久久久粉嫩av| 中文字幕亚洲综合久久| 亚洲福利视频免费观看| 北条麻妃一区二区三区中文字幕| 欧美风情在线观看| 一本色道久久88亚洲综合88| 国产综合在线观看视频| 亚洲精品国产综合区久久久久久久| 欧美激情亚洲一区| 日韩中文字幕在线播放| 97视频在线观看视频免费视频| 亚洲女性裸体视频| 成人性生交xxxxx网站| 精品免费在线观看| 岛国av一区二区在线在线观看| 欧美一级bbbbb性bbbb喷潮片| 韩国一区二区电影| 中文字幕日韩精品在线观看| 国产精品一区二区性色av| 国产精品久久久久久久久久东京| 精品视频www| 中文字幕精品av| 国产亚洲欧洲高清一区| 国产精品福利片| 亚洲激情第一页| 欧美午夜宅男影院在线观看| 国产主播在线一区| www.午夜精品| 欧美精品videos性欧美| 日韩av手机在线| 欧美大片欧美激情性色a∨久久| 欧美大尺度在线观看| xxx成人少妇69| 福利视频一区二区| 亚洲va电影大全| 国产精品久久久久久久久久久不卡| 91精品久久久久久久久青青| 国产日韩一区在线| 久久久精品电影| 欧美激情日韩图片| 久久久久久美女| 日韩在线播放视频| 91中文字幕在线观看| 亚洲国产毛片完整版| 欧美高清视频在线观看| 日韩美女免费视频| 日韩精品中文字| 91豆花精品一区| 亚洲精品白浆高清久久久久久| 欧美高清一级大片| 成人免费大片黄在线播放| 欧美成人免费网| 欧美高清视频在线| 亚洲直播在线一区| 国产精品狼人色视频一区| 一区二区三区 在线观看视| 国产69久久精品成人| 国产成人拍精品视频午夜网站| 欧美大尺度电影在线观看| 日本久久久久久久久久久| 有码中文亚洲精品| 在线观看成人黄色| 亚洲视频在线观看视频| 欧美国产日本高清在线| 欧美在线视频在线播放完整版免费观看| 国产va免费精品高清在线观看| 日韩一区二区三区在线播放| 97在线看免费观看视频在线观看| 国产精品18久久久久久首页狼| 美女视频黄免费的亚洲男人天堂| 精品香蕉一区二区三区| 久久成人精品一区二区三区| 黄色精品在线看| 成人午夜在线影院| 欧美精品久久久久久久久| 欧美又大又硬又粗bbbbb| 久久国内精品一国内精品| 欧美风情在线观看| 欧美裸体xxxx极品少妇| 国产亚洲欧洲在线| 一个人www欧美| 亚洲成人av资源网| 日韩精品在线观看视频| 国产情人节一区| 超碰日本道色综合久久综合| 中文字幕在线日韩| 国产亚洲欧美aaaa| 2019国产精品自在线拍国产不卡| 亚洲国产成人精品久久| 国产欧美一区二区三区久久人妖| 成人在线免费观看视视频| 国产一区二区欧美日韩| 精品高清一区二区三区| 日韩一区av在线| 精品久久久在线观看| 亚洲欧美日韩精品久久亚洲区| 97在线观看免费高清| 精品福利在线观看| 亚洲欧美国产精品| 精品国产一区二区三区久久狼黑人| 91亚洲人电影| 5278欧美一区二区三区| 久久久久久18| 国产精品久久久| 日韩av免费网站| 57pao国产成人免费| 久热精品视频在线观看一区| 亚洲a在线观看| 久久精品国亚洲| 少妇高潮 亚洲精品| 国产欧美日韩综合精品| 在线播放国产精品| 黄网站色欧美视频| 日韩电影在线观看永久视频免费网站| 欧美激情国产日韩精品一区18| 日韩中文字幕在线观看| 91av免费观看91av精品在线| 欧美极品xxxx| 国产日韩欧美综合| 成人精品久久一区二区三区| 亚洲成在人线av| 欧美午夜精品久久久久久久| 欧美电影电视剧在线观看| 欧美性极品xxxx娇小|