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"/>