0

我在动态处理MouseUp事件时遇到问题。有问题的测试代码:

WPF:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>

        <Button x:Name="Button1" Content="Button1" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
        <Button x:Name="Button2" Content="Button2" HorizontalAlignment="Left" Margin="10,37,0,0" VerticalAlignment="Top" Width="75"/>

    </Grid>
</Window>

C# 后面:

using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Button2.MouseLeftButtonUp += something;
        }

        private void something(object sender, MouseEventArgs e)
        {
            MessageBox.Show("TEST");
            Button2.MouseLeftButtonUp -= something;
        }
    }
}

现在,我希望在我点击后MessageBox第一次显示带有文本“TEST”的。它没有出现。相同的代码适用于事件,但我需要获取鼠标位置。我已经确认第一个函数会触发,但无论我尝试什么,第二个函数都不会触发。帮助?Button2Button1ClickMouseUp

4

1 回答 1

3

请参阅ButtonBase.Click中的备注部分:

ButtonBase 将 MouseLeftButtonDown 事件标记为在 OnMouseLeftButtonDown 方法中处理,并引发 Click 事件。因此,从 ButtonBase 继承的控件永远不会发生 OnMouseLeftButtonDown 事件。相反,将事件处理程序附加到 PreviewMouseLeftButtonDown 事件,或调用 AddHandler(RoutedEvent, Delegate, Boolean) 并将handledEventsToo 设置为true。

由于MouseLeftButtonDown是在内部处理的,因此您也不会收到任何 MouseLeftButtonUp事件。但是,您可以改用PreviewMouseLeftButtonUp事件。

于 2012-12-21T09:49:05.620 回答