c# - 为什么不触发 MouseEnter 事件?

标签 c# wpf button visibility

进一步调查表明,问题在于按钮的鼠标输入事件并不总是触发。大多数时候它会触发,但无论是最初还是在按钮被隐藏(或折叠)之后,事件都不会触发。如果我更改为应启用按钮的另一种情况,它就会启用。即使将按钮的 ZIndex 设置为 9999 似乎也无济于事。

我重写了代码以使用绑定(bind)来设置按钮图像源和可见性,但问题仍然表现出相同的症状。

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


旧标题:

为什么我的按钮激活码不总是有效?

我正在试验一个 UI,其中某些按钮仅在特定条件下处于事件状态,并且仅在鼠标移到它们的位置上时才可见。 (注意:我实际上正在考虑放弃这种方法,但我想知道为什么我的代码不起作用。)

我遇到的问题是在某些情况下按钮未激活。

The button isn't visible or active when I first run the program, but should become active (although invisible by dint of there being no text or image set) when an album is selected and there are other albums by the same artist .

但是,这不会发生在第一张符合条件的专辑中。如果选择了另一个符合这些条件的相册,则该按钮确实变得可见并且行为正确。

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

我有以下 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;
    }

Then when an album is chosen I call the following code to make the next (and previous) album buttons selectable.

        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 后我必须调用什么来重新连接事件处理程序吗?

最佳答案

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

关于c# - 为什么不触发 MouseEnter 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3583587/

相关文章:

c# - 如何将 JSON 对象转换为特定格式

c# - 用于 3D 渲染/建模的 FPGA

c# - 控制台应用程序中的 Application.Current "null"

wpf - 带有背景图像和颜色的文本框

WPF ListBox OnScroll事件

c# - 从集合继承和实现可枚举接口(interface)时,IEnumerable 扩展方法 (System.Linq) 不可用

c# - 更新面板中的 Ajax GridView 选择不起作用

c# - 从页面 *.aspx.cs 调用 javascript 函数

javascript - onclick 函数在第一次点击时不起作用

swift - 为定位服务添加开始按钮 [Swift 3.0 - Xcode]