2010-08-27 113 views
3

进一步的调查显示,问题是鼠标输入事件的按钮并不总是射击。大部分时间都是这样,但是无论是最初还是隐藏(或折叠)按钮后,事件都不会触发。如果我改变到另一种应该启用按钮的情况,它会这样做。即使将按钮的ZIndex设置为9999似乎也没有帮助。为什么不是MouseEnter事件触发?

我已经重写了代码以使用Bindings来设置按钮图像源和可见性,并且问题仍然表现出相同的症状。

当鼠标移过它们时,第一次按钮应该可见(但不显示图像),它们不显示工具提示或显示。如果我使用键盘/鼠标键循环播放不同的相册,则按钮开始表现良好。如果我再次选择并且下一个艺术家有多个相册,则按钮开始表现。


旧标题:

为什么我的按钮激活码一直在努力?

我正在尝试使用UI,其中某些按钮仅在特定条件下处于活动状态,并且只有在鼠标移过其位置时才能看到。 (注:我实际上是想放弃这种方法,但我想知道为什么我的代码不工作

我得到的问题是,在某些情况下,按钮不是活性。

当我第一次运行该程序时,该按钮不可见或不活跃,但当选择某个相册并且存在其他相册时,该按钮应该变为活动状态(尽管无法看到没有文本或图像设置)艺术家。

但是,这并不适用于所选的第一张合格专辑。如果选择了符合这些标准的另一个相册,则的按钮变得可见并且行为正确。

因此,它看起来像东西没有被正确初始化,但我不明白我错过了什么。

我有以下XAML:

<BitmapImage x:Key="NextAlbumSource" CacheOption="OnLoad" 
      CreateOptions="IgnoreImageCache" UriSource="resources/next.png"/> 


<Window.CommandBindings> 
    <CommandBinding Command="{x:Static local:AlbumChooser.Next}" 
        CanExecute="NextCanExecute" Executed="NextExecuted" /> 
</Window.CommandBindings> 


    <Button Height="50" Width="50" Margin="0,0,10,155" 
      Command="{x:Static local:AlbumChooser.Next}" Name="NextAlbum" 
      ToolTip="Next Album" HorizontalAlignment="Right" 
      VerticalAlignment="Bottom" 
      MouseEnter="NextAlbum_MouseEnter" MouseLeave="NextAlbum_MouseLeave"> 
     <Image /> 
    </Button> 

然后在“的MouseEnter”处理我有以下几点:

private void NextAlbum_MouseEnter(object sender, MouseEventArgs e) 
    { 
     if (haveAlbum && moreAlbumsBySameArtist) 
     { 
      ((sender as Button).Content as Image).Source = this.nextImage; 
     } 
    } 

我仔细检查过和它肯定得到的行设置图像源。它只是不显示它。

的“鼠标离开”处理程序(完整性是):

private void NextAlbum_MouseLeave(object sender, MouseEventArgs e) 
    { 
     ((sender as Button).Content as Image).Source = null; 
    } 

然后,当一个相册选择我调用下面的代码,以使选择下一个(和以前)的专辑的按钮。

 Visibility navigationVisiblity = haveAlbum && moreAlbumsBySameArtist 
      ? Visibility.Visible : Visibility.Hidden; 
     this.NextAlbum.Visibility = navigationVisiblity; 

命令处理器NextCanExecute是相同的代码:

private void NextCanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = haveAlbum && moreAlbumsBySameArtist; 
    e.Handled = true; 
} 

(是,存在一种用于重构这里的情况)。

注:

haveAlbum实际上是对!string.IsNullOrEmpty(this.albumPath.Text)

moreAlbumsBySameArtist测试是一个方法调用。

UPDATE

我只是试着改变代码来设置图像的Opacity,而不是设置Source并出现同样的问题。进一步的测试表明,事实上鼠标悬停事件处理程序没有被调用。我不是在运行时添加或删除处理程序,所以它看起来像系统不会触发事件?

为什么会这样?设置按钮的Visibility显然会影响到这一点 - 在设置回Visible以让事件处理程序再次连线后,我必须调用它吗?

+0

我刚刚发现这个问题 - http://stackoverflow.com/questions/3290855/wpf-opacity-and-the-mouseenter-event - 它可能很有趣。 – ChrisF 2010-10-17 17:24:09

回答

0

这可能是您的NextCanExecute方法CommandBinding在某些条件下返回false,禁用您的按钮。

+0

我应该添加'NextCanExecute'使用与可见性代码相同的测试。我会仔细检查一下,但我也会更新这个问题。 – ChrisF 2010-08-27 11:19:56

+0

并且e.CanExecute返回true吗? – Arcturus 2010-08-27 11:25:18

+0

当我尝试调试时,代码*出现*表现为自己。当我更新用户界面时很难说清楚这些事件,并在应用程序丢失并重新获得焦点时触发这些事件。但是如果我通过这些方法一切都会返回预期的值。 – ChrisF 2010-08-27 11:34:34

1

这种情况有一些可能的缺陷。由于MouseEnter和MouseLeave是RoutedEvents,它们可能由其他元素处理。 使用DragMove()拖动时也存在问题。它可以防止拖动时触发所有这些事件。

+0

我遇到过有关RoutedEvents的一些信息 - 我不确定它是否适用,但现在你已经提到它,我会再次检查。 – ChrisF 2010-10-19 13:30:37

相关问题