gpt4 book ai didi

c# - 为什么鼠标不移动时会触发 MouseMove 事件

转载 作者:行者123 更新时间:2023-11-30 14:26:00 25 4
gpt4 key购买 nike

我有一个 ItemsControl,它的 ItemsPresenter 响应 MouseMove 事件。项目在数据源中移动,如果在移动项目时鼠标位于控件上,这会导致 MouseMove 事件触发,即使鼠标没有移动也是如此。

下面是一个演示问题的例子。

XAML:

<ItemsControl Name="ladder" ItemsSource="{Binding Rows}">
<ItemsControl.Template>
<ControlTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="Header" Grid.Column="0" />
<ItemsPresenter Grid.Row="1"
MouseMove="OnMouseMove"/>
</Grid>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>

C#:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
Rows.Add(new Row { Name = "0" });
Rows.Add(new Row { Name = "1" });
Rows.Add(new Row { Name = "2" });
Rows.Add(new Row { Name = "3" });
Rows.Add(new Row { Name = "4" });

DispatcherTimer t = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(1000) };
t.Tick += T_Tick;
t.Start();
}

private void T_Tick(object sender, EventArgs e)
{
Rows.Move(4, 0);
}

private void OnMouseMove(object sender, MouseEventArgs e)
{
Debug.WriteLine(e.Timestamp);
}

public ObservableCollection<Row> Rows { get; set; } = new ObservableCollection<Row>();
}

public class Row
{
public string Name { get; set; }

public override string ToString()
{
return Name;
}
}

如果调试/运行它,将鼠标移到 ItemsControl 上,然后将其留在那里,您将在输出窗口中看到 MouseMove 事件正在触发随着控件中的项目四处移动。

有什么原因吗?或者有没有办法过滤掉这些事件,只响应“真正的”鼠标移动事件?

最佳答案

在您的示例中,这些事件是从您的项目展示者的子控件中冒出来的,即来自 TextBlocks。如果你这样做:

private void OnMouseMove(object sender, MouseEventArgs e)
{
var tb=(TextBlock)e.OriginalSource;
var lastMove = e.GetPosition((IInputElement)e.OriginalSource);
Debug.WriteLine(tb.Text + ":" + lastMove);
}

你会看到每次事件的原始来源都是不同的文本 block (0 1 2 3 4 5),并且是一个现在鼠标下的文本 block 。从这个文本 block 的角度来看,鼠标确实被移动了 - 它没有超过它然后变成了结束。我同意这是有争议的行为,甚至可以被认为是错误。要解决此问题,我认为最简单的方法是记住上次鼠标移动位置并检查它是否已更改:

private Point _lastMove;
private void OnMouseMove(object sender, MouseEventArgs e)
{
var p = e.GetPosition((IInputElement)sender);
if (_lastMove != p) {
// really moved
_lastMove = p;
}
}

关于c# - 为什么鼠标不移动时会触发 MouseMove 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36702791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com