私はItemsControl
のItemsPresenter
がMouseMove
イベントに応答しています。項目はデータソース内で移動され、アイテムが移動されたときにマウスがコントロール上にあると、マウスが動いていなくても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#が:あなたは、デバッグ/これを実行し、ItemsControl
の上にマウスを移動し、そこにそれを残す場合は
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;
}
}
、[出力]ウィンドウに表示されますMouseMove
イベントが制御シフトの項目として発生していることを示します。
これにはどのような理由がありますか?または、これらのイベントをフィルタリングして「本当の」マウス移動イベントにのみ応答する方法はありますか?
マウスの視点から推測します。 – LarsTech
しかし、マウスのコントロールではなく、コントロールの観点からのイベントですか? – WasGoodDone
マウスの位置を同時に出力できますか?裸眼で見えない小さなマウスの動きがあるかもしれないが、コンピュータがピックアップしているのだろうか? –