2012-03-07 12 views
6

Chcę wyświetlić przycisk tylko wtedy, gdy użytkownik umieści kursor myszy nad jego lokalizacją, gdy mysz opuści obszar, przycisk powinien powrócić do bycia ukrytym. Oto mój kod dla przycisków.Regulacja widoczności przycisku za pomocą myszy MouseOver

<StackPanel Name="ButtonOptions" Orientation="Horizontal" DockPanel.Dock="Bottom" Background="DarkBlue" Height="50" Width="auto"> 
    <!--<StackPanel.Resources> 
     <Style TargetType="Button"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </StackPanel.Resources>--> 
    <Button Name="LoginButton" FontSize="12" Click="LoginButton_Click" Content="Log In" Width="100" Height="31" Margin="50,0,0,0" 
      FontFamily="Arial" Visibility="Visible" IsEnabled="True" MouseEnter="LoginButton_MouseEnter" /> 
    <Button Name="OptionsButton" Content="Options" Width="100" Height="31" Margin="20,0,0,0" FontFamily="Arial" 
      FontSize="12" Click="OptionsButton_Click" Visibility="Hidden" IsEnabled="False"/> 
</StackPanel> 

Sekcja resouces jest komentowana, ponieważ próbowałem i nie działała. Mój dziennik w przycisk ma następujące eventhandler załączony ..

LoginButton.MouseEnter += new MouseEventHandler(LoginButton_MouseEnter); 

metoda, która obsługuje to jest ..

private void LoginButton_MouseEnter(object sender, MouseEventArgs e) 
{ 
    MessageBox.Show("Made in the login button listener for mouseOver"); 

    LoginButton.Visibility = Visibility.Visible; 
} 

Kiedy uruchamiam moją aplikację, nic się nie dzieje, gdy kładę na lokalizację, w której powinien być przycisk. Jeśli jednak najpierw ustawię widoczność przycisku logowania na Widoczny, widzę przycisk, a kiedy go klikam, moja logiczna metoda logiczna dla zalogowania się przez użytkownika zostanie nadpisana i pojawia się komunikat z komunikatem metoda MouseEventListener dla "Wykonane w detektorze przycisku logowania dla mouseOver". Nie tylko to, ale otrzymuję dwa z tych komunikatów (gdy tylko kliknę "OK" po raz pierwszy, natychmiast wyskakuje ponownie) Nie jestem pewien, dlaczego to nie działa, ani dlaczego moja metoda zdarzenia kliknięcia jest ignorowana i TERAZ pojawia się metoda mouseEvent.

Wszelkie przemyślenia lub pomoc będą mile widziane, dziękuję!

+2

zdarzenia nie ognia, gdy przycisk jest ukryty lub upadł. – 0x4f3759df

+2

Nie należy używać wyskakujących okienek do diagnozowania przesunięć myszy. Otrzymujesz dwa pop-upy, ponieważ po kliknięciu myszką w oknie dialogowym, aby je zamknąć, nie jesteś już przytłoczony elementem, który go uruchomił! Kiedy okno dialogowe się zamknie, ponownie uruchomi kursor myszy nad zdarzeniem. –

+0

@iterationx: Myślę, że to prawda, ale możesz * może * być w stanie go zastąpić, jeśli otrzymasz IsHitTestVisible. –

Odpowiedz

26

Nie na temat: posiadanie nagle pozycji "pod" myszką jest naprawdę złym projektem i radzę ją zmienić.

Temat: Jak już wspomniano w sekcji komentarzy, za każdym razem, gdy kontrolka jest ukryta lub zwinięta, przestanie przetwarzać wszelkie dane wejściowe, więc nie będzie wyzwalać żadnych wyzwalaczy.

Możesz użyć właściwości Opacity, aby zaimplementować zachowanie, którego szukasz, a ponadto użyj funkcji EventTrigger w "MouseEnter" i "MouseLeave", aby móc umieścić tam ładną animację. Oto jak chciałbym napisać, że styl:

<Style x:Key="FadeOutButton" TargetType="{x:Type Button}"> 
    <Style.Triggers> 
     <EventTrigger RoutedEvent="Control.MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard > 
        <DoubleAnimation Duration="0:0:1" To="1" Storyboard.TargetProperty="Opacity"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Control.MouseLeave"> 
      <BeginStoryboard> 
       <Storyboard > 
        <DoubleAnimation Duration="0:0:1" To="0.2" Storyboard.TargetProperty="Opacity"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Style.Triggers> 
</Style> 

Teraz z powrotem na mój pierwszy pomysł, chciałbym zdecydowanie wskazują na utrzymanie przycisk widoczny nawet gdy mysz nie jest skończona (opacity = 0,2 w moim przykładzie powyżej) i bawić się z czasy animacji. Jeśli nie jest to opcja, zawsze możesz ustawić czas trwania animacji na 0: 0: 0 i wartość krycia ti 0, a uzyskasz taki sam wynik jak widoczność (przynajmniej wizualnie).

Później Edit: Musisz zastosować styl na przycisków tak:

<Button Content="my button" Style="{StaticResource FadeOutButton}" Opacity="0.2"/> 
+0

+1 za komentarz na temat mądrości (lub jej braku) ukrytych elementów. –

+0

@Matt Burland i AlexDrenea - zdaję sobie sprawę, że nie jest to najlepszy sposób na zrobienie czegoś, ale ta aplikacja działa w telewizji, która wyświetla dane z bazy danych, menedżerowie mogą wejść i dostosować to, co jest wyświetlane na ekranie przez inne okna, otwarty przez przyciski. Są ukryte, ponieważ wyświetlanie tych przycisków w telewizorze byłoby brzydkie, a menedżerowie wiedzieliby o ich lokalizacji podczas korzystania z aplikacji. – Ryan

+0

@AlexDrenea - Próbowałem dodać kod na górze mojego xaml jako zasób okna, ale nic się nie stało. Czy muszę uwzględnić zasób, w którym definiuję mój przycisk, czy też styl jest uniwersalny dla wszystkich przycisków w oknie? A może moje zdarzenia MouseEnter i MouseLeave właśnie nadpisują ten styl? – Ryan