首页 > 解决方案 > 在同一按钮 WPF C# 上调用 MouseDown 事件后,MouseUp 事件处理程序不起作用

问题描述

我在 C# WPF 表单中有一个显示密码按钮,我想要的是:

问题是 MouseUp 事件只有在我们不执行鼠标按钮按下 (MouseDown) 时才会被触发Button。这意味着,如果我们第一次执行MouseDown Button那么之后将不会触发MouseUp事件。

这是 XAML 代码:

<Button Grid.Row="1" Grid.Column="2" Margin="10,10,0,0" Width="25" Height="25">
   <Image x:Name="showPassword_Button" Source="eye.jpg" MouseDown="showPassword_Button_MouseDown" MouseUp="showPassword_Button_MouseUp"></Image>
</Button>

这是事件处理程序的 C# 代码:

private void showPassword_Button_MouseDown(object sender, MouseButtonEventArgs e)
{
    visiblePassword_TextBox.Text = password_TextBox.Password;
    visiblePassword_TextBox.Visibility = Visibility.Visible;
}

private void showPassword_Button_MouseUp(object sender, MouseButtonEventArgs e)
{
    // This function does not get called
    visiblePassword_TextBox.Visibility = Visibility.Hidden;
    password_TextBox.Visibility = Visibility.Visible;
}

标签: c#wpfwpf-controls

解决方案


您需要在MouseDown事件处理函数中添加以下内容:

e.Handled = true;

当您执行鼠标按下时,除非您释放鼠标按钮,否则不会处理该事件。所以它会阻止MouseUp 事件。您需要e.Handled = true;在事件处理程序内部添加MouseDown,以告诉程序该事件已被处理。

函数showPassword_Button_MouseDown()应该写成:

private void showPassword_Button_MouseDown(object sender, MouseButtonEventArgs e)
{
    visiblePassword_TextBox.Text = password_TextBox.Password;
    visiblePassword_TextBox.Visibility = Visibility.Visible;
    e.Handled = true; // Specify that event has been handled
}

推荐阅读