WPF中的自定义按钮模板 [英] Custom button template in WPF
问题描述
我想创建一个简单的按钮模板,其中包含图像和文本。但是我想保持系统按钮的外观。
I want to create a simple button template with an image and text inside it. But I want to keep the System button's look and feel.
如何逐步创建它?
PS:我已经在WPF中使用 CustomControl
和 BasedOn
属性进行过尝试。
P.S.: I have already tried it with CustomControl
in WPF and BasedOn
property.
推荐答案
您可以使用样式和附加属性轻松完成此操作:
You can do this easily with a style and attached property:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ap="clr-namespace:MyProject.Namespace.Path.To.ButtonProperties">
...
<Style x:Key="ImageButton" TargetType="Button">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Path=(ap:ButtonProperties.Image), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"></Image>
<ContentPresenter Content="{Binding Path=Content, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"></ContentPresenter>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
...
</ResourceDictionary>
和
public class ButtonProperties
{
public static ImageSource GetImage(DependencyObject obj)
{
return (ImageSource)obj.GetValue(ImageProperty);
}
public static void SetImage(DependencyObject obj, ImageSource value)
{
obj.SetValue(ImageProperty, value);
}
public static readonly DependencyProperty ImageProperty =
DependencyProperty.RegisterAttached("Image", typeof(ImageSource), typeof(ButtonProperties), new UIPropertyMetadata((ImageSource)null));
}
然后在标记中:
<Button Style="{StaticResource ImageButton}" ap:ButtonProperties.Image="{StaticResource MyImage}" Content="Test">
</Button>
此示例看起来非常丑陋,但是您可以轻松更改 StackPanel
到 Grid
或类似的方式来限制图像比例。使用 ContentPresenter
可以保留按钮的行为,允许您将任何 UIElement
放入其中,并保留Command支持等等。
This example looks pretty hideous, but you can easily change the StackPanel
to a Grid
or something similar to constrain the image proportion. Using the ContentPresenter
allows you to preserve the behaviour of a button allowing you to put any UIElement
inside, and retaining Command support etc.
这篇关于WPF中的自定义按钮模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!