1

私は基本的に、自分のプログラムに単純な問題があり、正しく動作することを確認したいだけです。マウス ボタンをクリックする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 イベントがトリガーされなくなるため、円ではなくグリッドにイベントを追加する必要がありました。しかし、なぜそれが起こるのでしょうか?イベントの開始時に、マウスは間違いなく円の上にあり、その後移動しました。はい、サークルから離れましたが、それでもイベントをトリガーするべきではありませんか?

4

3 に答える 3

5

マウスをキャプチャして、楕円内のすべてのイベントを処理できます。

<Grid Name="grid1" Background="White">
    <Ellipse Height="50" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="{x:Null}" VerticalAlignment="Top" Width="50" Fill="Black"
             MouseLeftButtonDown="ellipse1_MouseDown" MouseLeftButtonUp="ellipse1_MouseUp" />
</Grid>

このコードビハインドで

private void ellipse1_MouseDown(object sender, MouseButtonEventArgs e)
{
    Mouse.Capture(ellipse1);
    _oldPoint = e.GetPosition(grid1);
    ellipse1.MouseMove += new MouseEventHandler(ellipse1_MouseMove);
}

private void ellipse1_MouseUp(object sender, MouseButtonEventArgs e)
{
    Mouse.Capture(null);
    ellipse1.MouseMove -= new MouseEventHandler(ellipse1_MouseMove);
}

grid_MouseMove を ellipse1_MouseMove に移動して名前を変更しました。

于 2012-10-22T14:35:52.447 に答える
2

Peterが言ったことに加えて、イベントを使用して、が内にGrid.MouseDownあるかどうかを確認 し、イベントを処理した場合、この奇妙な動作は見られません。oldPointEllipseMouseMove

イベントを探索することもお勧めしdragます。

于 2012-10-22T13:57:49.437 に答える
1

コントロールは、マウスが特定のコントロールの上にある限り、マウスイベントのみを取得します。

新しいコントロールに移動すると、マウスは古いコントロールから解放され、新しいコントロールにフックされます。

プロセス全体にアタッチされたグローバル フックを作成する方法はいくつかありますが、これは私たちが話していることではないと思います。

于 2012-10-22T13:52:04.997 に答える