我正在尝试开发一个应用程序,该应用程序使用存储在单独的远程文件位置的多个图像。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);
}
}