最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年04月19日 11:29:41   作者:小明GG  
接觸WPF也有兩個多月了,有了一定的理論基礎和項目經(jīng)驗,現(xiàn)在打算寫一個系列,做出來一個WPF的控件庫。下面這篇文章主要給大家介紹了關于WPF自定義控件和樣式之自定義按鈕(Button)的相關資料,需要的朋友可以參考下。

一、前言

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

二、固定樣式的按鈕

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

2.1 普通按鈕-扁平化風格

先看效果:

定義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>

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

2.2 圖標按鈕

先看效果:

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的圖片資源可自己替換,替換之后能有更豐富的效果呈現(xiàn)。

2.3 圖標文字混合按鈕

效果:

實現(xiàn)代碼:

<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控件去掉就行。

三、復用性高的按鈕

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

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

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

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>

效果如下:

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

總結

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

相關文章

  • 在C#語言里對NULL的技術處理小結

    在C#語言里對NULL的技術處理小結

    在 C# 中處理 null 值是編寫可靠且可靠的代碼的一個重要方面,在本文中,我將討論一些在 C# 中處理 null 值的最常用技術,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • c# 開發(fā)文字識別軟件

    c# 開發(fā)文字識別軟件

    這篇文章主要介紹了c# 開發(fā)文字識別軟件的方法,幫助大家更好的利用c#進行文字識別,感興趣的朋友可以了解下
    2020-12-12
  • 京東聯(lián)盟C#接口測試示例分享

    京東聯(lián)盟C#接口測試示例分享

    這篇文章主要介紹了京東聯(lián)盟C#接口測試示例分享的相關資料,需要的朋友可以參考下
    2017-12-12
  • C#實現(xiàn)讀取Word表格到DataSet

    C#實現(xiàn)讀取Word表格到DataSet

    在應用項目里,多數(shù)情況下我們會遇到導入 Excel 文件數(shù)據(jù)到數(shù)據(jù)庫的功能需求,但某些情況下,也存在使用 Word 進行表格數(shù)據(jù)編輯的情況,這其中也包括導入Word內(nèi)容的功能,比如表格數(shù)據(jù)導出到DataSet數(shù)據(jù)集,本文將給大家介紹了C#讀取Word表格到DataSet
    2023-12-12
  • C#實現(xiàn)鼠標拖拽無邊框浮動窗體的方法

    C#實現(xiàn)鼠標拖拽無邊框浮動窗體的方法

    一般情況下,在標題欄中按住鼠標左鍵不放即可實現(xiàn)拖動操作,當做浮動窗體時,如果包含窗體邊框,那么界面給使用者的感覺將很不友好,因此本文給大家介紹了C#實現(xiàn)鼠標拖拽無邊框浮動窗體的方法,感興趣的朋友可以參考下
    2024-04-04
  • C#中各種計時器用法小結

    C#中各種計時器用法小結

    這篇文章主要介紹了C#中各種計時器用法,結合實例形式總結分析了C#中各種常用時間相關類實現(xiàn)計時器功能的操作技巧,需要的朋友可以參考下
    2017-06-06
  • 基于C#編寫一個操作XML的簡單類庫XMLHelper

    基于C#編寫一個操作XML的簡單類庫XMLHelper

    這篇文章主要為大家詳細介紹了如何基于C#編寫一個操作XML的簡單類庫——XMLHelper,文中的示例代碼講解詳細,需要的小伙伴可以參考一下
    2023-06-06
  • WPF實現(xiàn)時鐘特效

    WPF實現(xiàn)時鐘特效

    這篇文章主要介紹了WPF實現(xiàn)時鐘特效,過程很簡單,感興趣的小伙伴們可以參考一下
    2015-11-11
  • Unity編輯器資源導入處理函數(shù)OnPreprocessAudio用法示例

    Unity編輯器資源導入處理函數(shù)OnPreprocessAudio用法示例

    這篇文章主要為大家介紹了Unity編輯器資源導入處理函數(shù)OnPreprocessAudio用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • C#中public變量不能被unity面板識別的解決方案

    C#中public變量不能被unity面板識別的解決方案

    這篇文章主要介紹了C#中public變量不能被unity面板識別的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論

吉木乃县| 洞口县| 开平市| 潮安县| 徐水县| 化德县| 广丰县| 讷河市| 巨鹿县| 曲水县| 纳雍县| 布拖县| 鄢陵县| 吉林省| 承德市| 贞丰县| 吉安市| 昌平区| 社旗县| 咸宁市| 定南县| 青海省| 台湾省| 清丰县| 浦东新区| 怀安县| 常德市| 馆陶县| 竹山县| 镇巴县| 临汾市| 蒙阴县| 宁晋县| 固镇县| 莒南县| 平远县| 教育| 龙口市| 峨眉山市| 邢台县| 英吉沙县|