Дальнейшие исследования показали, что проблема в том, что событие ввода мыши для кнопки не всегда срабатывает. В большинстве случаев это происходит, но изначально или после того, как кнопка была скрыта (или свернута), событие не срабатывает. Если я перехожу на другой случай, когда кнопки должны быть включены, это происходит. Даже установка 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
, чтобы снова подключить обработчики событий?