自定义按钮,每个州都有图像

时间:2012-06-08 16:13:35

标签: wpf binding user-controls imagesource

我正在尝试创建一个像按钮一样的自定义用户控件,但我希望它为每个状态使用不同的图像(正常,悬停,按下)。用户控件包含一个用于显示图像的Image控件。我想在运行时更改Image控件的Source,所以当OnMouseEnter事件触发时,我会将我的图像源更改为HoverChange(ImageSource)属性。

所以我尝试将3个ImageSource属性(NormalState,HoverState和PressedState)添加到usercontrol,以便我可以在需要时更改图像。 (来自WinForms)但问题是属性没有在代码中设置(WinForms行为),所以我无法将它们分配给我的图像。但是当我在我的程序中使用usercontrol时,我可以通过属性面板设置它们,但是我不能在代码中使用它们(它们保持为NULL)。

以下是我想要达到的一些(伪)代码:

public partial class ThreeStateButton : UserControl
{

    public enum ButtonState
    {
        Normal,
        Hover,
        Pressed
    }

    public ImageSource NormalState { get; set; }
    public ImageSource HoverState { get; set; }
    public ImageSource PressState { get; set; }

    public ThreeStateButton()
    {
        InitializeComponent();
        SetState(ButtonState.Normal);
     }

    public void SetState(ButtonState state)
    {
        switch (state)
        {
            case ButtonState.Normal:
                imgButton.Source = NormalState;
                break;
            case ButtonState.Hover:
                imgButton.Source = HoverState;
                break;
            case ButtonState.Pressed:
                imgButton.Source = PressState;
                break;
        }
    }

    protected override void OnMouseEnter(MouseEventArgs e)
    {
        base.OnMouseEnter(e);

        SetState(ButtonState.Hover);
    }

    protected override void OnMouseLeave(MouseEventArgs e)
    {
        base.OnMouseLeave(e);

        SetState(ButtonState.Normal);
    }

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonDown(e);

        SetState(ButtonState.Pressed);
    }

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonDown(e);

        SetState(ButtonState.Hover);
    }
}

主要问题是初始化后没有设置ImageSource属性(是的,通过编辑器中的属性面板设置),我知道WPF的工作方式有点不同但是我怎么能得到这个按照我的方式工作?

由于

1 个答案:

答案 0 :(得分:0)

我是以更加WPF风格的方式做到的。 我创建了3个图像源属性,并为每个属性创建了一个DependencyProperty。我还在我的xaml代码中添加了3个Image控件,并使用他们的注册名称DependencyProperty将这些imagesource属性绑定到我的图像控件的imagesource属性。然后,这只是隐藏图像或将图像设置为正确状态的问题。