进一步的调查显示,问题是鼠标输入事件的按钮并不总是射击。大部分时间都是这样,但是无论是最初还是隐藏(或折叠)按钮后,事件都不会触发。如果我改变到另一种应该启用按钮的情况,它会这样做。即使将按钮的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
以让事件处理程序再次连线后,我必须调用它吗?
我刚刚发现这个问题 - http://stackoverflow.com/questions/3290855/wpf-opacity-and-the-mouseenter-event - 它可能很有趣。 – ChrisF 2010-10-17 17:24:09