2013-10-11 46 views
0

我想当我点击一个按钮是背景图像更改为其他人,当我释放按钮回到他的原始图像。经过大量的研究,我发现这个tutorial,这帮助我很多,工作得很好!但问题是我不能禁用按钮,它显示它被禁用,但如果我点击它,它就像它没有被禁用一样工作!下面是代码按钮不会禁用

using System; 
using System.Windows; 
using System.Windows.Media.Imaging; 

namespace DotNetApp 
{ 
    public partial class ButtonImage 
    { 
     #region Fields 

     public new static readonly DependencyProperty IsEnabledProperty = DependencyProperty.Register("IsEnabled", typeof (bool), typeof (ButtonImage), null); 
     public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof (string), typeof (ButtonImage), null); 
     public static readonly DependencyProperty ImagePressedSourceProperty = DependencyProperty.Register("ImagePressedSource", typeof (string), typeof (ButtonImage), null); 
     public static readonly DependencyProperty ImageDisabledSourceProperty = DependencyProperty.Register("ImageDisabledSource", typeof (string), typeof (ButtonImage), null); 

     private BitmapImage _image; 
     private BitmapImage _imagePressed; 
     private BitmapImage _imageDisabled; 
     private bool _isPressed; 

     #endregion 

     #region Constructor 

     public ButtonImage() 
     { 
      InitializeComponent(); 
     } 

     #endregion 

     #region Properties 

     public new bool IsEnabled 
     { 
      get { return (bool)GetValue(IsEnabledProperty); } 

      set 
      { 
       SetValue(IsEnabledProperty, value); 

       SetImageFromState(); 
      } 
     } 

     public string ImageSource 
     { 
      get { return (string) GetValue(ImageSourceProperty); } 

      set 
      { 
       SetValue(ImageSourceProperty, value); 

       _image = SetImage(value); 
       SetImageFromState(); 
      } 
     } 

     public string ImagePressedSource 
     { 
      get { return (string) GetValue(ImagePressedSourceProperty); } 

      set 
      { 
       SetValue(ImagePressedSourceProperty, value); 

       _imagePressed = SetImage(value); 
       SetImageFromState(); 
      } 
     } 

     public string ImageDisabledSource 
     { 
      get { return (string) GetValue(ImageDisabledSourceProperty); } 

      set 
      { 
       SetValue(ImageDisabledSourceProperty, value); 

       _imageDisabled = SetImage(value); 
       SetImageFromState(); 
      } 
     } 

     #endregion 

     #region Event Handlers 

     private void ButtonIsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 
     { 
      SetImageFromState(); 
     } 

     private void ButtonMouseEnter(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      _isPressed = true; 

      SetImageFromState(); 
     } 

     private void ButtonMouseLeave(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      _isPressed = false; 

      SetImageFromState(); 
     } 

     #endregion 

     #region Private Methods 

     private static BitmapImage SetImage(string imageSource) 
     { 
      BitmapImage bitmapImage = null; 

      if (!string.IsNullOrEmpty(imageSource)) 
      { 
       bitmapImage = new BitmapImage(new Uri(imageSource, UriKind.RelativeOrAbsolute)); 
      } 

      return bitmapImage; 
     } 

     private void SetImageFromState() 
     { 
      if (!IsEnabled) 
      { 
       image.Source = _imageDisabled; 
      } 
      else if (_isPressed) 
      { 
       image.Source = _imagePressed; 
      } 
      else 
      { 
       image.Source = _image; 
      } 
     } 

     #endregion 
    } 
} 

的一部分这里是XAML

<Tap_Test:ButtonImage ImageSource="/images/buttons/star2.png" 
           ImageDisabledSource="/images/buttons/star2lock.png" 
           ImagePressedSource="/images/buttons/star2-2.png" 
           Style="{StaticResource ButtonImageStyle}" 
           x:Name="star2" Margin="136,80,134,480" BorderBrush="{x:Null}" Click="star2_Click" IsEnabled="False"/> 

您可以查看我提供的链接上的完整代码!我也试过star2.IsEnable = false;,它没有工作。有什么建议么?谢谢!

回答

0

我认为问题来自于这样“SetImageFromState()”方法总是运行,你需要一种方法来停止投放的事实,考虑一下:

private bool _disableButton; 

public bool disableButton { 
           get { return _disableButton; } 
           set { 
            _disableButton = value; 
            SetValue(IsEnabledProperty, !_disableButton);   

            } 
          } 

public new bool IsEnabled 
    { 
     get { return (bool)GetValue(IsEnabledProperty); } 

     set 
     { 
      if(!disableButton) 
      { 
       SetValue(IsEnabledProperty, value); 
       SetImageFromState(); 
      } 


     } 
    } 

所以,如果你想禁用真正的按钮,你会去

myButton.disableButton = true; 
+0

嗨@KillaKem感谢对我的帮助,但想出这个错误App.ButtonImage.disableButtton.get”必须声明主体,因为它不标记为抽象,EXTERN或部分。任何想法为什么? –

+0

编译器需要disableButton的getter的主体,检查编辑的代码是否修复问题。 – KillaKem

+0

哦,我看到了,谢谢,但仍然没有禁用按钮:(我仍然可以点击它。 –