进一步的调查显示,问题是按钮的鼠标输入事件并不总是触发。它大部分时间都是这样,但无论是最初还是隐藏(或折叠)按钮后,事件都不会触发。如果我改为应该启用按钮的另一种情况,它会。即使将按钮的ZIndex
设置为9999似乎也无济于事。
我已经重写代码以使用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;
}
}
我已经仔细检查了,它肯定会到达设置图像源的行。它只是没有显示它。
“MouseLeave”处理程序(完整性为):
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
是方法调用。
更新
我刚刚尝试更改代码以设置图片的Opacity
,而不是设置Source
,并且会出现同样的问题。进一步的测试表明,事实处理程序中没有调用鼠标悬停事件。我不是在运行时添加或删除处理程序,所以看起来系统没有触发事件?
为什么会这样?设置按钮的Visibility
会明显影响这一点 - 在将其设置回Visible
以使事件处理程序再次连接后,我必须调用一些内容吗?
答案 0 :(得分:1)
在这种情况下可能存在一些陷阱。由于MouseEnter和MouseLeave是RoutedEvents,因此它们可能由其他元素处理。 使用DragMove()拖动时也存在问题。它可以防止在拖动时触发所有这些事件。
答案 1 :(得分:0)
在某些条件下,NextCanExecute
上的CommandBinding
方法可能会返回false
,从而禁用您的按钮。