为什么MouseEnter事件不会被触发?

时间:2010-08-27 11:13:46

标签: c# wpf button visibility

进一步的调查显示,问题是按钮的鼠标输入事件并不总是触发。它大部分时间都是这样,但无论是最初还是隐藏(或折叠)按钮后,事件都不会触发。如果我改为应该启用按钮的另一种情况,它会。即使将按钮的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以使事件处理程序再次连接后,我必须调用一些内容吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

在某些条件下,NextCanExecute上的CommandBinding方法可能会返回false,从而禁用您的按钮。