当拖动Thumb时如何捕获MouseEnter?

3

我有一个Canvas中包含一个Thumb(包含一个TextBlock)和一个Border。

Thumb接收拖放事件,可以正常拖动。

我的需求是,在Thumb拖动时捕获Border的MouseEnter事件。

但问题是,当鼠标按钮释放后,才会触发MouseEnter事件。

那么,如何在鼠标按下时就知道鼠标进入了Border呢?

Xaml代码:

<Grid>
<Canvas Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <Canvas Name="dragTarget">
        <Thumb
            DragStarted="Thumb_DragStarted" 
            DragDelta="Thumb_DragDelta"
            DragCompleted="Thumb_DragCompleted">
            <Thumb.Template>
                <ControlTemplate>
                    <TextBlock
                        Text="Some Text"
                        Foreground="White"
                        Background="DimGray"/>
                </ControlTemplate>
            </Thumb.Template>
        </Thumb>
    </Canvas>
    <Border Width="100" Height="100" Margin="50,50,0,0" 
        BorderBrush="AliceBlue" BorderThickness="1" Background="Silver"
        MouseEnter="Border_MouseEnter"/>
</Canvas>

Xaml.cs:

bool isDragging = false;
double x = 0;
double y = 0;

private void Border_MouseEnter(object sender, MouseEventArgs e)
{
    if(isDragging)
        Title = "Captured";
}

private void Thumb_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
{
    isDragging = true;
    x = e.HorizontalOffset;
    y = e.VerticalOffset;
}

private void Thumb_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
    isDragging = false;
}

private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
    x += e.HorizontalChange;
    y += e.VerticalChange;
    dragTarget.Margin = new Thickness(x , y , 0, 0);
}
1个回答

1

当拖动鼠标时,鼠标会被捕获,因此您可能无法收到消息。

在Thumb_DragDelta事件中,使用边框获取鼠标位置。它将相对于边框。检查鼠标点是否在边框内。

Point point = Mouse.GetPosition(border);

Rect rect = new Rect(0, 0, border.ActualWidth, border.ActualHeight);
Boolean mouseInBorder = rect.Contains(point);

if (mouseInBorder && !mouseLastInBorder)
{
    // Mouse enter "event";
}
if (!mouseInBorder && mouseLastInBorder)
{
    // Mouse exit "event";
}
mouseLastInBorder = mouseInBorder;

谢谢Lee。我一直在寻找一种捕获拖放目标事件的方法,因为在实际应用中有太多类似边框的对象。但是你的解决方案非常好,完全不会使用户界面变慢。 - Bizhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接