【问题标题】:How can I capture MouseEnter while dragging a Thumb?如何在拖动拇指时捕获 MouseEnter?
【发布时间】:2012-10-05 08:50:35
【问题描述】:

我有一个拇指(包含一个文本块)和一个画布内的边框。 Thumb 接收到拖动事件,并且正在正确拖动。

我需要的是在拇指拖动时在边框上捕获 MouseEnter 事件。

问题是 MouseEnter 在 DragCompleted 事件之后被触发(在释放鼠标按钮之后)。 鼠标按下时如何知道鼠标何时进入边框?

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);
}

【问题讨论】:

    标签: wpf drag-and-drop slider


    【解决方案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;
    

    【讨论】:

    • 谢谢李。我一直在寻找一种从放置目标中捕获事件的方法,因为实际应用程序中有太多类似边框的对象。但是您的解决方案工作得很好,并且根本不会减慢 UI。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2019-06-05
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多