我正在尝试开发一个使用大量图像的应用程序,这些图像存储在单独的远程文件位置中。 UI元素的文件路径存储在“应用程序设置”中。虽然我了解如何使用MultiBinding和值转换器从“应用程序设置”访问图像,但我不确定如何将Multibinding集成到下面的ImageButton ControlTemplate中。任何人都可以引导我朝着正确的方向前进吗?
<Image.Source>
<MultiBinding Converter="{StaticResource MyConverter}">
<Binding Source="{StaticResource Properties.Settings}" Path="Default.pathToInterfaceImages" />
<Binding Source="ScreenSaver.png"></Binding>
</MultiBinding>
</Image.Source>
<Button Click="btn_ScreenSaver_Click" Style="{DynamicResource ThreeImageButton}"
local:ThreeImageButton.Image="C:\Skins\ScreenSaver_UP.png"
local:ThreeImageButton.MouseOverImage="C:\Skins\ScreenSaver_OVER.png"
local:ThreeImageButton.PressedImage="C:\Skins\ScreenSaver_DOWN.png"/>
<Style
x:Key="ThreeImageButton"
TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="10"/>
<Setter Property="Height" Value="34"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<StackPanel Orientation="Horizontal" >
<Image Name="PART_Image" Source= "{Binding Path=(local:ThreeImageButton.Image), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" />
</StackPanel>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Source" Value="{Binding Path=(local:ThreeImageButton.MouseOverImage), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" TargetName="PART_Image"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Source" Value="{Binding Path=(local:ThreeImageButton.PressedImage), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" TargetName="PART_Image"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Source" Value="{Binding Path=(local:ThreeImageButton.Image), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" TargetName="PART_Image"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
public class ThreeImageButton : DependencyObject
{
// Add three new Dependency Properties to the Button Class to hold the
// path to each of the images that are bound to the control, displayed
// during normal, mouse-over and pressed states.
public static readonly DependencyProperty ImageProperty;
public static readonly DependencyProperty MouseOverImageProperty;
public static readonly DependencyProperty PressedImageProperty;
public static ImageSource GetImage(DependencyObject obj)
{ return (ImageSource)obj.GetValue(ImageProperty); }
public static ImageSource GetMouseOverImage(DependencyObject obj)
{ return (ImageSource)obj.GetValue(MouseOverImageProperty); }
public static ImageSource GetPressedImage(DependencyObject obj)
{ return (ImageSource)obj.GetValue(PressedImageProperty); }
public static void SetImage(DependencyObject obj, ImageSource value)
{ obj.SetValue(ImageProperty, value); }
public static void SetMouseOverImage(DependencyObject obj, ImageSource value)
{ obj.SetValue(MouseOverImageProperty, value); }
public static void SetPressedImage(DependencyObject obj, ImageSource value)
{ obj.SetValue(PressedImageProperty, value); }
// Register each property with the control.
static ThreeImageButton()
{
var metadata = new FrameworkPropertyMetadata((ImageSource)null);
ImageProperty = DependencyProperty.RegisterAttached("Image", typeof(ImageSource), typeof(ThreeImageButton), metadata);
var metadata1 = new FrameworkPropertyMetadata((ImageSource)null);
MouseOverImageProperty = DependencyProperty.RegisterAttached("MouseOverImage", typeof(ImageSource), typeof(ThreeImageButton), metadata1);
var metadata2 = new FrameworkPropertyMetadata((ImageSource)null);
PressedImageProperty = DependencyProperty.RegisterAttached("PressedImage", typeof(ImageSource), typeof(ThreeImageButton), metadata2);
}
}
答案 0 :(得分:3)
使用XAML属性元素语法:
<ControlTemplate TargetType="{x:Type Button}">
<StackPanel Orientation="Horizontal" >
<Image>
<Image.Source>
<MultiBinding Converter="{StaticResource MyConverter}">
<Binding Source="{StaticResource Properties.Settings}"
Path="Default.pathToInterfaceImages" />
<Binding Path="(local:ThreeImageButton.Image)"
RelativeSource="{RelativeSource TemplatedParent}" />
</MultiBinding>
</Image.Source>
</Image>
</StackPanel>
</ControlTemplate>
注意这意味着你的附加属性需要是字符串而不是ImageSources,因为它们将是输入到你的路径组合转换器。