2010-08-27 112 views
3

進一步的調查顯示,問題是鼠標輸入事件的按鈕並不總是射擊。大部分時間都是這樣,但是無論是最初還是隱藏(或摺疊)按鈕後,事件都不會觸發。如果我改變到另一種應該啓用按鈕的情況,它會這樣做。即使將按鈕的ZIndex設置爲9999似乎也沒有幫助。爲什麼不是MouseEnter事件觸發?

我已經重寫了代碼以使用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; 
     } 
    } 

我仔細檢查過和它肯定得到的行設置圖像源。它只是不顯示它。

的「鼠標離開」處理程序(完整性是):

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以讓事件處理程序再次連線後,我必須調用它嗎?

+0

我剛剛發現這個問題 - http://stackoverflow.com/questions/3290855/wpf-opacity-and-the-mouseenter-event - 它可能很有趣。 – ChrisF 2010-10-17 17:24:09

回答

0

這可能是您的NextCanExecute方法CommandBinding在某些條件下返回false,禁用您的按鈕。

+0

我應該添加'NextCanExecute'使用與可見性代碼相同的測試。我會仔細檢查一下,但我也會更新這個問題。 – ChrisF 2010-08-27 11:19:56

+0

並且e.CanExecute返回true嗎? – Arcturus 2010-08-27 11:25:18

+0

當我嘗試調試時,代碼*出現*表現爲自己。當我更新用戶界面時很難說清楚這些事件,並在應用程序丟失並重新獲得焦點時觸發這些事件。但是如果我通過這些方法一切都會返回預期的值。 – ChrisF 2010-08-27 11:34:34

1

這種情況有一些可能的缺陷。由於MouseEnter和MouseLeave是RoutedEvents,它們可能由其他元素處理。 使用DragMove()拖動時也存在問題。它可以防止拖動時觸發所有這些事件。

+0

我遇到過有關RoutedEvents的一些信息 - 我不確定它是否適用,但現在你已經提到它,我會再次檢查。 – ChrisF 2010-10-19 13:30:37

相關問題