当前位置: 首页 > 知识库问答 >
问题:

即使光标位于画布之外,也会调用MouseMove事件

何烨华
2023-03-14

我不知道我的代码或WPF是否有问题,但问题是:我想创建一个小程序,你可以在画布上用光标绘制。我有一个简单的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="475" Width="544">
<Grid>    
    <Grid.RowDefinitions>
        <RowDefinition Height="100px"></RowDefinition>
        <RowDefinition Height ="*"></RowDefinition>
        <RowDefinition Height="100px"></RowDefinition>
    </Grid.RowDefinitions>    
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100px"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
        <ColumnDefinition Width="100px"></ColumnDefinition>
    </Grid.ColumnDefinitions>
        <Canvas Grid.Row="1" Grid.Column="1"  Name="imageCanvas" MouseEnter="StackPanel_MouseEnter" MouseLeave="StackPanel_MouseLeave" Background="LightGray" 
                      MouseDown="StackPan_MouseDown" MouseUp="StackPan_MouseUp" MouseMove="StackPan_MouseMove">

        </Canvas>        
</Grid>

这是后台代码:

   private void StackPan_MouseDown(object sender, MouseButtonEventArgs e)
    {
        draw = true;
    }

    private void StackPan_MouseUp(object sender, MouseButtonEventArgs e)
    {
        draw = false;
    }

    private void StackPan_MouseMove(object sender, MouseEventArgs e)
    {
        if (draw)
        {
            var pos = Mouse.GetPosition(imageCanvas);
            Rectangle rec = new Rectangle()
                    {
                        Width = 10,
                        Height = 10,
                        Fill = Brushes.Red,
                    };
            Canvas.SetTop(rec, pos.Y);
            Canvas.SetLeft(rec, pos.X);
            imageCanvas.Children.Add(rec);
        }

    }

我能做的是:https://www.dropbox.com/s/7moq4p8f8f409b3/wpf_canvas.png

当光标位于画布之外时,为什么要调用StackPan\u MouseMove?

这是可执行文件,您可以在其中注意到这种行为:https://www.dropbox.com/s/ye1w2j9chld2oif/WpfApplication1.exe

共有2个答案

文凯康
2023-03-14

您可以通过画布的矩形子级获得MouseMove事件。

尽管您应该更好地使用InkPresenter或InkCanvas(正如用户键盘P所说),但您可以简单地使矩形对命中测试不可见。然后它们将不再产生任何输入事件。

Rectangle rec = new Rectangle()
{
    Width = 10,
    Height = 10,
    Fill = Brushes.Red,
    IsHitTestVisible = false // here
};
傅正阳
2023-03-14

尝试将画布放置在边框控件内,并将控件的ClipToBounds属性设置为true。

<Border ClipToBounds="true" Grid.Row="1" Grid.Column="1" >
    <Canvas Name="imageCanvas" MouseEnter="StackPanel_MouseEnter" MouseLeave="StackPanel_MouseLeave" Background="LightGray" 
            MouseDown="StackPan_MouseDown" MouseUp="StackPan_MouseUp" MouseMove="StackPan_MouseMove">
    </Canvas>
</Border>

另一方面,似乎InkPresenter/InkCanvas更适合您的操作,除非您出于特定原因避免使用它们。

 类似资料:
  • 对未来情况的简要描述: 当鼠标在画布上移动时,我希望在画布上显示一个椭圆。椭圆应该一直跟随鼠标移动,直到用户点击鼠标左键。当用户点击鼠标左键时,程序会将椭圆放置在画布上。 因此,我使用了以下xaml代码: 和c#代码: 问题是,一旦鼠标离开画布,椭圆仍然会粘在鼠标上,甚至可以将椭圆放置在画布之外。 首先,我使用了代码(代码来自stijn: C#-WPF-画布上的Mousemove事件会重载鼠标事件

  • 我使用形状和画布,我想做一些像地图编辑器的东西。当鼠标在画布上移动时,我会在每次移动时将实际选定的对象绘制到画布上的鼠标位置,以便使用该程序的用户可以看到该对象放置在画布上时的外观。 单击鼠标,我将当前对象/位置添加到列表中,其中包含每次更新都需要在画布上绘制的放置元素。 问题是,如果鼠标移动处理程序处于活动状态(绑定到画布),那么click事件不会一直触发,我需要连续单击大约十次来放置元素。如果

  • 问题内容: 我有一个包含10个元素的div,这些元素将被逐个更新,延迟时间为2秒。下面是相同的代码 但是,当我运行它时,所有元素都会一起更新。该程序只是添加一个延迟添加一个开始,并且所有元素都一起更新(被标记)。如何制作代码来逐一标记元素? 问题答案: 您正在打破React的两个基本规则: 不要直接改变状态 如果根据现有状态更新状态,请使用回调形式,因为状态更新可能是异步的(无论如何,在您的示例中

  • 我希望能够在我的WPF应用程序中从任何地方检测到事件。也就是说,如果用户在控件中单击并保持单击,然后在控件外释放它,我希望触发我的事件。 我已经完成了事件,它可以工作,但是如果在之外释放,MouseUp事件不会被触发。

  • 我正在创建一个如下所示的JobDetail,