在鼠标上下事件中发送相同对象的按钮

本文关键字:对象 按钮 鼠标 上下 事件 | 更新日期: 2023-09-27 18:08:42

我在WPF窗口中创建了2个按钮,并为两个按钮添加了鼠标上下事件。我在一个按钮上鼠标向下,在第二个按钮上鼠标向上。但我得到相同的第一个按钮对象在两个事件的事件处理程序。我的问题是为什么我没有在鼠标向上事件中获得第二个按钮对象。

这是我的XAML
<Window x:Class="MouseDownUpSample.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="but1" Content="source" HorizontalAlignment="Left" Margin="86,68,0,0" VerticalAlignment="Top" Width="75" PreviewMouseLeftButtonDown="Button_MouseDown" PreviewMouseLeftButtonUp="Button_MouseUp" />
    <Button x:Name="but2" Content="destination" HorizontalAlignment="Left" Margin="406,164,0,0" VerticalAlignment="Top" Width="75" PreviewMouseLeftButtonDown="Button_MouseDown" PreviewMouseLeftButtonUp="Button_MouseUp"/>
</Grid>

代码
 public partial class MainWindow : Window
{
    string source = null;
    string destination = null;
    public MainWindow()
    {
        InitializeComponent();
    }
    private void Button_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Button src=sender as Button;
        source = src.Content as string;
    }
    private void Button_MouseUp(object sender, MouseButtonEventArgs e)
    {
        Button src = sender as Button;
        destination = src.Content as string;
        if(destination.Equals(source))
        {
        }
    }

我正试图通过拖动&下降

在鼠标上下事件中发送相同对象的按钮

我的问题是为什么我没有得到第二个按钮对象在鼠标向上事件。

因为这就是按钮的工作方式。

摘自MSDN:

当鼠标指针在窗体或控件上时按下鼠标按钮,该对象将"捕获"鼠标并接收所有鼠标事件,包括最后一个MouseUp事件。

你可能会感兴趣:

如果连续按下鼠标按钮,则在第一次按下鼠标后捕获鼠标的对象接收所有鼠标事件,直到所有按钮被释放。

Mouse.MouseDown在按下任何一个鼠标按钮时出现,而Mouse.MouseUp在释放任何一个鼠标按钮时出现。所以当你点击一个按钮MouseUp事件总是跟着MouseDown事件,因为它们是连续的事件。因此,在本例中,if()条件始终是true

if(destination.Equals(source))
{
    //always executed;
}

我通过WPF拖动实现了我的目标&使用拖拽效果。复制

XAML

<Window x:Class="MouseDownUpSample.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="but1" Content="source" HorizontalAlignment="Left" Margin="86,68,0,0" VerticalAlignment="Top" 
            Width="75" PreviewMouseMove="but_MouseMove" AllowDrop="True"   PreviewDrop="but_Drop" />
    <Button x:Name="but2" Content="destination" HorizontalAlignment="Left" Margin="406,164,0,0" VerticalAlignment="Top" 
            Width="75" PreviewMouseMove="but_MouseMove" AllowDrop="True"   PreviewDrop="but_Drop"/>
</Grid>

代码
 public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
    }
    private void but_MouseMove(object sender, MouseEventArgs e)
    {
        Button src=sender as Button;
        if (src != null && e.LeftButton == MouseButtonState.Pressed)
        {
            DragDrop.DoDragDrop(src,
                                 src.Content.ToString(),
                                 DragDropEffects.Copy);
        }
    }
    private void but_Drop(object sender, DragEventArgs e)
    {
        Button dest = sender as Button;
        string destinationContent = null; 
        destinationContent = dest.Content as string;
        if (dest != null)
        {
            if (e.Data.GetDataPresent(DataFormats.StringFormat))
            {
                string sourceContent = (string)e.Data.GetData(DataFormats.StringFormat);
                if (destinationContent.Equals(sourceContent))
                {
                    Console.WriteLine("equal");
                }
            }
        }
    }

}