我不知道我的代码或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
您可以通过画布的矩形子级获得MouseMove事件。
尽管您应该更好地使用InkPresenter或InkCanvas(正如用户键盘P所说),但您可以简单地使矩形对命中测试不可见。然后它们将不再产生任何输入事件。
Rectangle rec = new Rectangle()
{
Width = 10,
Height = 10,
Fill = Brushes.Red,
IsHitTestVisible = false // here
};
尝试将画布放置在边框控件内,并将控件的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,