Почему не происходит событие MouseEnter? - PullRequest
3 голосов
/ 27 августа 2010

Дальнейшие исследования показали, что проблема в том, что событие ввода мыши для кнопки не всегда срабатывает. В большинстве случаев это происходит, но изначально или после того, как кнопка была скрыта (или свернута), событие не срабатывает. Если я перехожу на другой случай, когда кнопки должны быть включены, это происходит. Даже установка ZIndex кнопок на 9999, похоже, не помогает.

Я переписал код, чтобы использовать привязки для установки источника и видимости изображения кнопки, и проблема все еще проявляет те же симптомы.

В первый раз кнопки должны быть видны (но без изображения), когда мышь перемещается над ними, они не отображают всплывающую подсказку или не отображаются. Если я переключаюсь на другой альбом, используя клавиши клавиатуры / мыши, кнопки начинают работать. Если я выберу снова и у следующего исполнителя будет несколько альбомов, кнопки начнут себя вести.


Старое название:

Почему мой код активации кнопки не всегда работает?

Я экспериментирую с пользовательским интерфейсом, в котором определенные кнопки активны только при определенных условиях и становятся видимыми только тогда, когда мышь перемещается над их местоположением. ( ПРИМЕЧАНИЕ: на самом деле я думаю отказаться от этого подхода, но я хотел бы знать, почему мой код не работает. )

У меня проблема в том, что при некоторых обстоятельствах кнопка не активируется.

Кнопка не видна или не активна при первом запуске программы, но должна стать активной (хотя невидимой из-за отсутствия текста или изображения), когда выбран альбом и есть другие альбомы того же исполнителя .

Однако этого не происходит для первого выбранного отборочного альбома. Если выбран другой альбом, соответствующий этим критериям, кнопка делает видимой и ведет себя правильно.

Похоже, что-то не инициализировано должным образом, но для меня не очевидно, что я пропустил.

У меня есть следующий 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 - это вызов метода.

UPDATE

Я только что попытался изменить код для установки Opacity изображения вместо установки Source, и возникает та же проблема. Дальнейшее тестирование показало, что обработчик событий мыши не вызывается. Я не добавляю и не удаляю обработчик во время выполнения, поэтому похоже, что система не запускает событие?

С чего бы это? Настройка Visibility кнопки однозначно влияет на это - есть ли что-то, что я должен вызвать после установки его обратно в Visible, чтобы снова подключить обработчики событий?

Ответы [ 2 ]

1 голос
/ 19 октября 2010

В этой ситуации возможны некоторые подводные камни. Поскольку MouseEnter и MouseLeave являются RoutedEvents, они, возможно, обрабатываются другими элементами. Существует также проблема при перетаскивании с помощью DragMove (). Он предотвращает запуск всех этих событий при перетаскивании.

0 голосов
/ 27 августа 2010

Возможно, ваш NextCanExecute метод на CommandBinding вернет false при определенных условиях, отключив вашу кнопку.

...