2012-06-08 68 views
1

我试图创建一个自定义的用户控件,它像一个按钮,但我希​​望它为每个状态使用不同的图像(正常,悬停,按下)。用户控件包含一个Image控件以显示图像。我想在运行时更改图像控件的源代码,所以当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中的工作方式有点不同,但我怎么能按照我尝试的方式工作?

谢谢

+2

您应该使用Visual状态在XAML中创建样式。这个问题可能有帮助。 http://stackoverflow.com/q/7839235/73804 – 0x4f3759df

+0

代码会有帮助。 –

回答

0

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