C# 网格已设置PreviewMouseMove时未触发WPF按钮事件

C# 网格已设置PreviewMouseMove时未触发WPF按钮事件,c#,wpf,C#,Wpf,我在网格上有一个按钮,它不检测PreviewMouseLeftDown单击事件。 经过一些测试,我发现问题出在 如果删除PreviewMouseMove=“onMouseMove”部分,则会检测到MouseDown事件,但我需要这行代码,因为我还必须仅检测网格内的鼠标位置 XAML: 任何想法都欢迎。谢谢 我完全同意光明会,但也理解你。。。WPF和MVVM并不是那么“容易”去适应,我差不多用了一年的时间来适应,而且还有很多东西要学。 在这种情况下,我只能建议您阅读一些关于WPF、数据绑定、O

我在网格上有一个按钮,它不检测PreviewMouseLeftDown单击事件。 经过一些测试,我发现问题出在

如果删除PreviewMouseMove=“onMouseMove”部分,则会检测到MouseDown事件,但我需要这行代码,因为我还必须仅检测网格内的鼠标位置

XAML:



任何想法都欢迎。谢谢

我完全同意光明会,但也理解你。。。WPF和MVVM并不是那么“容易”去适应,我差不多用了一年的时间来适应,而且还有很多东西要学。 在这种情况下,我只能建议您阅读一些关于WPF、数据绑定、ObservableCollection和ViewModel的教程(这些是您需要知道的关键字)。 1) 创建一个ViewModel,您可以在其中定义ObservableCollection,ObservableCollection是一种列表,但使用它您可以(几乎)自动更新视图。因此,当您启动应用程序时,您将读取需要显示的按钮列表,然后将它们添加到ObservableCollection

对于您的测试,将是这样的:

Button button1=new Button();
Button button2=new Button();

//define all dimensions/parameters of your button

MyObservableCollection.Add(button1);
MyObservableCollection.Add(button2);
然后在XAML中,您只需要指定ItemsControl的ItemsSource(MyObservableCollection)。这样做,你不需要再所有的描述按钮内

然后,当你点击添加一个按钮时(在你的例子中),你只需要在代码中添加如下内容

Button newButton=new Button(); 
newButton.Height=defaultHeight...//width, background etc...
MyObservableCollection.Add(newButton);
同样,如果您对WPF/MVVM还不熟悉,我建议您从更简单的示例开始,创建一个包含简单对象的小listview,或者创建一个listbox

也可以建议您访问以下网站: wpf-tutorial.com
www.wpftuorial.net

最后,这实际上工作正常

对于测试,我设置了一个标签,在MouseMove事件中,我将鼠标位置发送到该标签,
lblcord.Content=Mouse.GetPosition(Application.Current.MainWindow)

如果鼠标点击,我将发送
lblcord.Content=“鼠标点击”

如果是MouseDown,我会发送
lblcord.Content=“MouseDown”

我可以在LBLCORD中看到鼠标坐标,我可以看到鼠标单击,但它从未显示MouseDown

然而,如果我在MouseDown事件中调用MessageBox,一切都会正常工作。所以我猜XAML
PreviewMouseMove=“onMouseMove”
即使在我不移动鼠标时也能工作,所以它总是向标签发送坐标,并覆盖
lblcord.Content=“MouseDown”比我能看到的快

这个问题的答案是:不要使用WPF并期望WinForms结果。。。
感谢大家的时间和努力

即使你得到了答案,恐怕你也要落井下石了!您应该学习有关命令的知识,也许可以从总体上提高对MVVM的理解。如果您觉得您的项目不需要它,那么WPF可能不是正确的选择。我觉得绑定很可疑,尤其是标签到标签的绑定…@TheMylc你能解释一下“绑定标签”有什么问题吗?我将它用于从数据库加载的一些数据,由于按钮是在运行时生成的,所以这就是我将数据分配给某些按钮属性的方式。它没有任何“错误”。用几句话来解释MVVM的概念是不可能的。但是试着自己回答这个问题:绑定源是什么?如果它是您自己设计的类,那么为什么您要将源属性称为“Tag”?我猜您正在尝试实现类似于图库的功能,可能是通过图片,您可以用鼠标移动图片,但当您单击它们时也会发生一些事情,对吗?为什么需要处理Click事件以及MouseUp和MouseDown?为什么你的按钮必须是一个按钮?澄清一下:你正在尝试制作一些东西,这太棒了,WPF是一个很棒的框架。我喜欢它。但我可以在第二行XAML中发现一个关键问题,即ItemsControl没有ItemsSource。这意味着您必须按程序填充它。这意味着您可以通过编程方式创建“内容”对象。这就引出了一个问题:“Tag”中的数据为什么不在内容中。我建议您花几个小时在MVVM上观看一些视频,尤其是MVVM light toolkit。这不能在五分钟内完成,但它非常值得你花时间。
Button newButton=new Button(); 
newButton.Height=defaultHeight...//width, background etc...
MyObservableCollection.Add(newButton);