在网上找了一下,发现这方面的资料并不多。做传统桌面的本来就不多了吧,更别说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