Wpf 自定义控件三态ImageButton,无法绑定图像源

Wpf 自定义控件三态ImageButton,无法绑定图像源,wpf,binding,custom-controls,imagebutton,Wpf,Binding,Custom Controls,Imagebutton,我正在创建自定义控件-图像按钮。其目的是使按钮没有任何背景或边框,只有3个图像处于正常状态,按下后鼠标悬停。当使用它-所有3个图像都应该有界。我从中获得了一些代码,但源代码是可靠的。我的代码是这样的: Generic.xaml: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microso

我正在创建自定义控件-图像按钮。其目的是使按钮没有任何背景或边框,只有3个图像处于正常状态,按下后鼠标悬停。当使用它-所有3个图像都应该有界。我从中获得了一些代码,但源代码是可靠的。我的代码是这样的:

Generic.xaml:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:JoesControls">
<Style TargetType="{x:Type local:ImageButton}" x:Key="styledImageButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ImageButton}">
                <Grid
                    Margin="{TemplateBinding Control.Padding}"
                    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                    VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
                    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"
                    >
                    <Image Name="Normal" Source="{TemplateBinding NormalSource}"/>
                    <Image Name="Pressed" Source="{TemplateBinding PressedSource}" Visibility="Hidden"/>
                    <Image Name="Over" Source="{TemplateBinding MouseOverSource}" Visibility="Hidden"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/>
                        <Setter TargetName="Pressed" Property="Visibility" Value="Visible"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/>
                        <Setter TargetName="Over" Property="Visibility" Value="Visible"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
它编译时没有错误,但显然不起作用。源代码未绑定。我猜源代码的绑定设置不正确,但我已经尝试了一段时间,在谷歌上搜索它,但我失败了。谢谢你的帮助


谢谢

我忘记了这个问题,尽管我已经实现了我想要的。今天我发现它还没有解决,所以我很高兴与您分享解决方案:

xaml.cs文件

namespace JoesControls.ImageButton
{
//JoesControls - Controls for WPF

/// <summary>
/// Interaction logic for ImageButton.xaml
/// </summary>
public partial class ImageButton : Button, INotifyPropertyChanged
{
    public ImageButton()
    {
        InitializeComponent();
    }
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        this.Ims = NormalSource;
    }

    #region NormalSourceProperty

    public static readonly DependencyProperty NormalSourceProperty =
        DependencyProperty.Register("NormalSource", typeof(ImageSource), typeof(ImageButton),
        new FrameworkPropertyMetadata(null,
              FrameworkPropertyMetadataOptions.AffectsRender |
              FrameworkPropertyMetadataOptions.AffectsParentMeasure));

    public ImageSource NormalSource
    {
        get { return (ImageSource)GetValue(NormalSourceProperty); }
        set
        {
            SetValue(NormalSourceProperty, value);
        }
    }

    #endregion // NormalSource

    #region PressedSourceProperty

    public static readonly DependencyProperty PressedSourceProperty =
        DependencyProperty.Register("PressedSource", typeof(ImageSource), typeof(ImageButton),
        new FrameworkPropertyMetadata(null,
              FrameworkPropertyMetadataOptions.AffectsRender |
              FrameworkPropertyMetadataOptions.AffectsParentMeasure));

    public ImageSource PressedSource
    {
        get
        {
            return (ImageSource)GetValue(PressedSourceProperty);
        }
        set
        {
            SetValue(PressedSourceProperty, value);
        }
    }

    #endregion // PressedSource

    #region MouseOverSourceProperty

    public static readonly DependencyProperty MouseOverSourceProperty =
        DependencyProperty.Register("MouseOverSource", typeof(ImageSource), typeof(ImageButton),
        new FrameworkPropertyMetadata(null,
              FrameworkPropertyMetadataOptions.AffectsRender |
              FrameworkPropertyMetadataOptions.AffectsParentMeasure));

    public ImageSource MouseOverSource
    {
        get
        {
            return (ImageSource)GetValue(MouseOverSourceProperty);
        }
        set
        {
            if (value == null)
                SetValue(MouseOverSourceProperty, NormalSourceProperty);
            else
                SetValue(MouseOverSourceProperty, value);
        }
    }

    #endregion // OverSource

    private void Button_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        changeImage(MouseOverSource);
    }

    private void Button_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {
        changeImage(NormalSource);
    }

    private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        changeImage(PressedSource);
    }

    private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        changeImage(MouseOverSource);
    }

    private void changeImage(ImageSource newSource)
    {
        //ButtonImage.Source = newSource;
        Ims = newSource;
    }

    private ImageSource _ims;
    public ImageSource Ims
    {
        get { return _ims; }
        set
        {
            _ims = value;
            OnPropertyChanged("Ims");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
}

以及xaml文件:

<Button x:Class="JoesControls.ImageButton.ImageButton"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    MouseEnter="Button_MouseEnter"
    MouseLeave="Button_MouseLeave"
    PreviewMouseDown="Button_PreviewMouseDown"
    PreviewMouseUp="Button_PreviewMouseUp"
    >
<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Image Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}, Path=Ims}"
                           Margin="{TemplateBinding Control.Padding}"
                           HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                           VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
                           SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"
                           MinHeight="10"                            
                           MinWidth="10"
                            />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Button.Style>

如果能发表一些评论来帮助其他人和我理解为什么这是一个糟糕的答案,那将是一件好事
<Button x:Class="JoesControls.ImageButton.ImageButton"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    MouseEnter="Button_MouseEnter"
    MouseLeave="Button_MouseLeave"
    PreviewMouseDown="Button_PreviewMouseDown"
    PreviewMouseUp="Button_PreviewMouseUp"
    >
<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Image Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}, Path=Ims}"
                           Margin="{TemplateBinding Control.Padding}"
                           HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                           VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
                           SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"
                           MinHeight="10"                            
                           MinWidth="10"
                            />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Button.Style>