如何封装属于自己的WPF控件库

在网上找了一下,发现这方面的资料并不多。做传统桌面的本来就不多了吧,更别说WPF了。我可能也要另寻出路了,不过我还是觉得做桌面挺有意思的。

言归正传

 首先,新建一个WPF自定义控件库项目

这里我们封装一个支持自己绘制形状的图片按钮

将默认的CustomControl1.cs改成ImageButton.cs

这个图片按钮的实现主要是用WPF的依赖属性来实现,有疑问的,可以先了解下依赖属性

https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/dependency-properties-overview

ImageButton.cs代码如下:

 1  public class ImageButton : System.Windows.Controls.Button
 2     {
 3         static ImageButton()
 4         {
 5             DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata(typeof(ImageButton)));
 6         }
 7 
 8         public static readonly DependencyProperty ButtonImageProperty = DependencyProperty.Register("ButtonImage", typeof(string), typeof(FrameworkElement));
 9 
10         public string ButtonImage
11         {
12             set
13             {
14                 SetValue(ButtonImageProperty, value);
15             }
16             get
17             {
18                 return (string)GetValue(ButtonImageProperty);
19             }
20         }
21     }

然后我们在Themes/Generic.xaml中定义ImageButton的样式

样式如下:

 1  <Style TargetType="{x:Type local:ImageButton}">
 2         <Setter Property="Template">
 3             <Setter.Value>
 4                 <ControlTemplate TargetType="{x:Type local:ImageButton}">
 5                     <Grid>
 6                         <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Panel.ZIndex="1"></ContentPresenter>
 7                         <Image Name="btnbg" Source="{Binding ButtonImage,RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Center" VerticalAlignment="Center"  Stretch="UniformToFill"/>
 8                     </Grid>
 9                     <ControlTemplate.Triggers>
10                         <!--如果要动态更改图标,只需再增加一个依赖属性ButtonImageHover,然后在Setter里设置Source就行了-->
11                         <!--<Trigger Property="IsMouseOver" Value="True">
12                             <Setter Property="Source"  Value="{Binding ButtonImageHover,RelativeSource={RelativeSource TemplatedParent}}" TargetName="btnbg" />
13                         </Trigger>-->
14                         
15                         <Trigger Property="IsMouseOver" Value="True">
16                             <Setter Property="Opacity"  Value=".9" TargetName="btnbg" />
17                         </Trigger>
18                         <Trigger Property="IsPressed" Value="True">
19                             <Setter Property="Opacity" Value=".7" TargetName="btnbg" />
20                         </Trigger>
21                     </ControlTemplate.Triggers>
22                 </ControlTemplate>
23             </Setter.Value>
24         </Setter>
25     </Style>

编译生成dll

接下来就可以使用了

新建一个WPF工程,引用 刚才生成的dll

猜你喜欢

转载自www.cnblogs.com/zhaotianff/p/9844457.html
今日推荐