代码之家  ›  专栏  ›  技术社区  ›  ChrisF

为什么MouseEnter事件没有开火?

  •  3
  • ChrisF  · 技术社区  · 15 年前

    ZIndex 到9999的按钮似乎没有帮助。

    当鼠标移动到按钮上时,按钮第一次应该可见(但不显示图像),它们不会显示工具提示或出现。如果我使用键盘/鼠标键循环到另一个相册,按钮就会开始起作用。如果我再次选择,下一个艺术家有多个专辑的按钮开始表现。


    注意:我实际上正在考虑放弃这种方法,但我想知道为什么我的代码不能工作。

    当我第一次运行该程序时,该按钮不可见或不活动,但当选定唱片集并且同一艺术家有其他唱片集时,该按钮应变为活动(尽管由于没有文本或图像集而不可见)。

    但是,对于选定的第一个符合条件的唱片集,不会发生这种情况。如果选择了符合这些条件的另一个唱片集,则按钮 变得可见并且行为正确。

    所以看起来有些东西没有正确地初始化,但我不清楚我错过了什么。

    <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

    更新

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

    Visibility 很明显的影响到这个-有什么事情我必须在把它设置回 Visible 让事件处理程序重新连接?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Alex Maker    15 年前

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

        2
  •  0
  •   Arcturus    15 年前

    可能是你的 NextCanExecute 方法论 CommandBinding 回报 false