Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何从控件模板创建通用背景图像绑定?_Wpf - Fatal编程技术网

Wpf 如何从控件模板创建通用背景图像绑定?

Wpf 如何从控件模板创建通用背景图像绑定?,wpf,Wpf,我有这种款式的按钮: <Style TargetType="Button" x:Key="btnStyle"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button">

我有这种款式的按钮:

<Style TargetType="Button" x:Key="btnStyle">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Image x:Name="img" Source="{TemplateBinding Tag}" Margin="{TemplateBinding Margin}"
                                 Stretch="None"></Image>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsPressed" Value="true">
                                    <Setter TargetName="img" Property="Source" Value="{DynamicResource imgClose_P}"/>
                                 </Trigger>
                                <Trigger Property="IsMouseOver" Value="true">
                                    <Setter TargetName="img" Property="Source" Value="{DynamicResource imgClose_H}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

如您所见,我正在将ImageSource绑定到按钮的Tag属性。 在Tag属性中,我将其绑定到存储此位图的ResourceDictionary:

<BitmapImage x:Key="imgClose_N" UriSource="..\AppImages\mainWindow\TopBanner\CloseButton_sN.png" />

这使我能够在整个应用程序中使用“Imagebutton”,使用不同的背景图像和一个模板。 问题是如何使用触发器保持这种通用方法? 我希望IsMouseOver触发器更改背景图像,但将其绑定到控件的某些属性,而不是将其硬编码到控件模板中。
如何做到这一点?

正如您所建议的,您可以将其称为“Imagebutton”,从
按钮中派生并定义一些要绑定到的图像属性,例如
背景图像
鼠标验证图像
,等等

按钮派生的另一种方法是使用设置图像并绑定到样式中的图像,但这些附加属性也必须在某个地方定义,这并不会使它变得更简单

以下是第一个解决方案的示例:

public class ImageButton : Button
{
    public static readonly DependencyProperty NormalBackgroundImageProperty = DependencyProperty.Register(
        "NormalBackgroundImage", typeof(ImageSource), typeof(ImageButton));

    public static readonly DependencyProperty MouseOverBackgroundImageProperty = DependencyProperty.Register(
        "MouseOverBackgroundImage", typeof(ImageSource), typeof(ImageButton));

    public static readonly DependencyProperty PressedBackgroundImageProperty = DependencyProperty.Register(
        "PressedBackgroundImage", typeof(ImageSource), typeof(ImageButton));

    public ImageSource NormalBackgroundImage
    {
        get { return (ImageSource)GetValue(NormalBackgroundImageProperty); }
        set { SetValue(NormalBackgroundImageProperty, value); }
    }

    public ImageSource MouseOverBackgroundImage
    {
        get { return (ImageSource)GetValue(MouseOverBackgroundImageProperty); }
        set { SetValue(MouseOverBackgroundImageProperty, value); }
    }

    public ImageSource PressedBackgroundImage
    {
        get { return (ImageSource)GetValue(PressedBackgroundImageProperty); }
        set { SetValue(PressedBackgroundImageProperty, value); }
    }
}
下面是一个合适的风格。请注意,此样式还为按钮的内容提供了一个新的绑定,它使用带有
RelativeSource={relativesourcetemplatedparent}
的常规绑定,而不是TemplateBindings。这些将在运行时进行评估

<Style TargetType="local:ImageButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ImageButton">
                <Grid Margin="{TemplateBinding Margin}">
                    <Image x:Name="img" Source="{Binding NormalBackgroundImage, RelativeSource={RelativeSource TemplatedParent}}" Stretch="None"/>
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="img" Property="Source" Value="{Binding MouseOverBackgroundImage, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter TargetName="img" Property="Source" Value="{Binding PressedBackgroundImage, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

你可以发布第一个建议的示例吗?为了更清楚,我希望我的控件有3个属性:普通bg图像、悬停bg图像和按下bg图像,所以在模板中我会将其绑定到它们。当然,但稍后。我现在得去开会:-)两个小时左右。待会儿见。非常感谢-我会尽量从网上挖掘你的建议
<local:ImageButton
    Margin="10"
    NormalBackgroundImage="C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"
    PressedBackgroundImage="C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg"
    MouseOverBackgroundImage="C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg"
    Content="Click Me"/>