1

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

所以我尝试向用户控件添加 3 个 ImageSource 属性(NormalState、HoverState 和 PressedState),以便在需要时更改图像。(来自 WinForms)但问题是属性没有在代码中设置(WinForms 行为),所以我不能将它们分配给我的图像。但是当我在我的程序中使用用户控件时,我可以通过属性面板设置它们,但我不能在代码中使用它们(它们保持为 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 中的工作方式有点不同,但我怎么能让这个工作方式我试试?

谢谢

4

1 回答 1

0

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

于 2012-06-21T21:18:22.323 回答