6

我的 WPF 项目使用了很多图像按钮,但是由于我没有找到正确的方法(我每次都必须编写相同的触发器和样式,唯一的区别是图像源),我的资源字典变得很长不求回报。有没有更好的方法来做到这一点?

这是我用于按钮的样式示例:

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <!-- Some setters -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Image Source="Images.png" Stretch="Fill"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <!-- Some triggers ( IsFocused, IsMouseOver, etc.) -->
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

谢谢 :)

4

3 回答 3

11

最简单的方法是创建具有Image属性的特定控件:

public class ImageButton : Button
{
    static ImageButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof (ImageButton),
            new FrameworkPropertyMetadata(typeof (ImageButton)));
    }


    public ImageSource Image
    {
        get { return (ImageSource)GetValue(ImageProperty); }
        set { SetValue(ImageProperty, value); }
    }

    public static readonly DependencyProperty ImageProperty =
        DependencyProperty.Register("Image", typeof(ImageSource), typeof(ImageButton), new PropertyMetadata(default(ImageSource)));

}

然后,您只需在 generic.xaml 中为其创建样式,并绑定到Image属性而不是显式设置图像:

<Style x:Key="{x:Type my:ImageButton}" TargetType="{x:Type my:ImageButton}">
    <!-- Some setters -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type my:ImageButton}">
                <Grid>
                    <Image Source="{TemplateBinding Image}" Stretch="Fill"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <!-- Some triggers ( IsFocused, IsMouseOver, etc.) -->
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后你可以像这样使用它:

<my:ImageButton Image="Image.png" />

如果按钮的不同状态需要更多图像,可以向控件添加更多依赖属性。

另一种可能的方法是使用我所说的“参数化样式”,以避免创建特定控件;有关详细信息,请参阅此博客文章

于 2013-08-28T07:43:57.137 回答
1

您可以尝试创建一个继承自 Button 的自定义控件,并将其用作模板中的 TargetType。然后您可以在 Image Source 中使用 TemplateBinding。

<Image Source="{TemplateBinding ImageSource}" Stretch="Fill"/>

您需要在自定义控件中创建 ImageSource 属性。这样您就可以在 xaml 中设置源,但您只需要一个资源模板。

于 2013-08-28T07:42:40.167 回答
0

您可以像这样使用 BasedOn 属性:

<Style x:Key="BlueHighlightedButtonStyle"  BasedOn="{StaticResource ButtonStyle}" TargetType="Button">
    <Setter Property="Background" Value="DeepSkyBlue"/>
</Style>

这将使按钮样式具有与您的 ButtonStyle 相同的属性,但具有 DeepSkyBlue 背景。

于 2013-08-28T07:35:06.227 回答