MouseMove事件寄存器错误输入

问题描述 投票:0回答:1

我在下面的代码中有一个椭圆,其中有一个鼠标移动事件。现在一切都很好,除非我在元素上使用mouse.capture。即使不移动鼠标,我也会在元素上应用mouse.capture,从而立即触发mouse move事件,并且使用setleft属性移动元素的位置也会触发鼠标移动事件,即使我不移动也是如此我的鼠标!这应该发生吗?如果有解决方案,我非常需要它。下面的代码将产生确切的问题...

using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;

namespace Test
{
    public partial class MainWindow : Window
    {
        public Ellipse elp;
        public Point clickPoint;
        public MainWindow()
        {
            InitializeComponent();
            testcanv.Background = Brushes.Transparent;
        }

        private void down(object sender, MouseButtonEventArgs e)
        {
            clickPoint = e.GetPosition(testcanv);
            if (e.ChangedButton == MouseButton.Left)
            {
                elp = new Ellipse
                {
                    Stroke = Brushes.Blue,
                    StrokeThickness = 2,
                    Width = 200,
                    Height = 200,
                    Margin = new Thickness(-250)
                };
                Canvas.SetLeft(elp, clickPoint.X);
                Canvas.SetTop(elp, clickPoint.Y);
                elp.MouseMove += circle_move;
                testcanv.Children.Add(elp);
            }
        }

        private void circle_move(object sender, MouseEventArgs e)
        {
            text.Text += "Moved,";
        }

        private async void click(object sender, RoutedEventArgs e)
        {
            Mouse.Capture(elp, CaptureMode.Element);
            await Task.Delay(1000);
            Canvas.SetLeft(elp, 100);
            Canvas.SetTop(elp, 100);
            await Task.Delay(500);
            Mouse.Capture(null);
        }
    }
}

这是我的XAML

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:balchal"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="50"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <Canvas x:Name="testcanv" Grid.Column="0" Grid.Row="0" MouseDown="down"/>
        <Button Grid.Column="1" Grid.Row="1" Content="Button" Click="click"/>
        <TextBox x:Name="text" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" Width="300" Margin="10"/>
    </Grid>
</Window>

预先感谢...我真的很感谢任何帮助...

c# .net wpf desktop-application
1个回答
0
投票

我可能是错的,但是我相信MouseMove事件总是在捕获时触发

最简单的解决方案,如果持续发生,可能只是将状态存储在click事件中,并在move事件开始时进行检查:立即返回并重置var。

bool CapturedFlag = false;

private void MoveEvent(object sender, MouseButtonEventArgs e)
{
    if(CapturedFlag = true)
    {
        CapturedFlag = false;
        return;
    }

    // other code
}

private async void CaptureEvent(object sender, RoutedEventArgs e)
{
    CapturedFlag = true;

    // other code
}
© www.soinside.com 2019 - 2024. All rights reserved.