使用MouseOver调整按钮可见性

时间:2012-03-07 19:59:33

标签: wpf button visibility

我想只在用户将鼠标放在其位置上时才显示按钮,一旦鼠标离开该区域,该按钮应该返回隐藏状态。这是我的按钮代码。

<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>

资源部分已被注释掉,因为我尝试了它并且它无效。我的登录按钮附加了以下事件处理程序..

LoginButton.MouseEnter += new MouseEventHandler(LoginButton_MouseEnter);

处理此问题的方法是..

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

    LoginButton.Visibility = Visibility.Visible;
}

当我运行我的应用程序时,当我放置按钮所在的位置时没有任何反应。但是,如果我最初将登录按钮的可见性设置为Visible,我可以看到该按钮,当我单击它时,我会覆盖用户登录的登录逻辑方法,并且系统会提示我输入消息框用于“在mouseOver的登录按钮侦听器中制作”的MouseEventListener方法。不仅如此,我收到了其中两条消息(第一次单击“确定”时,它会立即再次弹出)我不知道为什么它不起作用,也不知道为什么我的click事件方法被忽略了现在发生了mouseEvent方法。

感谢任何想法或帮助,谢谢!

1 个答案:

答案 0 :(得分:30)

题外话: 首先,让项目突然出现在你的鼠标“下面”真的是一个糟糕的设计,我会建议改变它。

在-话题: 正如其他人已在评论部分中提到的,每当控件被隐藏或折叠时,它将停止处理任何输入,因此您不会触发任何触发。

您可以使用Opacity属性来实现您寻找的行为,并在“MouseEnter”和“MouseLeave”上使用EventTriggers,以便能够在那里放置一个漂亮的动画。这就是我写这种风格的方式:

<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>

现在,回到我的第一个想法,我强烈建议即使鼠标没有结束也保持按钮可见(在上面的示例中不透明度= 0.2)并播放动画时间。如果它不是一个选项,您可以始终将动画持续时间设置为0:0:0和不透明度值ti 0,您将获得与可见性相同的结果(至少在视觉上)。

后来编辑: 您必须在按钮上应用样式,如下所示:

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