私は基本的に、自分のプログラムに単純な問題があり、正しく動作することを確認したいだけです。マウス ボタンをクリックするMouseEventHandler
と が追加され、イベント ハンドラが削除されるまで円がマウスとともに移動します。コードを非常に基本的なものに単純化しました。
XAML:
<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="350" Width="525">
<Grid Name="grid1" Background="White" MouseLeftButtonUp="grid_MouseUp">
<Ellipse Height="50" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="{x:Null}" VerticalAlignment="Top" Width="50" Fill="Black" MouseLeftButtonDown="ellipse1_MouseDown" />
</Grid>
</Window>
C#:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private static Point _oldPoint = new Point(), _newPoint = new Point();
private void ellipse1_MouseDown(object sender, MouseButtonEventArgs e)
{
_oldPoint = e.GetPosition(grid1);
grid1.MouseMove += new MouseEventHandler(grid_MouseMove);
}
private void grid_MouseUp(object sender, MouseButtonEventArgs e)
{
grid1.MouseMove -= new MouseEventHandler(grid_MouseMove);
}
private void grid_MouseMove(object sender, MouseEventArgs e)
{
_newPoint = e.GetPosition(grid1);
ellipse1.Margin = new Thickness(ellipse1.Margin.Left - _oldPoint.X + _newPoint.X, ellipse1.Margin.Top - _oldPoint.Y + _newPoint.Y, 0, 0);
_oldPoint = _newPoint;
}
}
現在、一般的に、このコードは正常に機能し、実際にボタンを押すまでマウスの動きをチェックしないため、非常にきれいだと思います。ただし、私の質問は次のとおりです。
MouseMove
マウス ポインターが (マウスの移動が速すぎて) 円のフォーカスを失うと、MouseMove イベントがトリガーされなくなるため、円ではなくグリッドにイベントを追加する必要がありました。しかし、なぜそれが起こるのでしょうか?イベントの開始時に、マウスは間違いなく円の上にあり、その後移動しました。はい、サークルから離れましたが、それでもイベントをトリガーするべきではありませんか?