Silverlight MouseLeave问题

时间:2009-08-14 03:31:52

标签: silverlight drag-and-drop mouseleave

我正在尝试在Silverlight中创建一个类似于this的颜色选择器,但是我在大方块区域中实现光标时遇到了麻烦。为了跟踪鼠标状态,我有一个_isMouseDown变量。在MouseLeave事件_isMouseDown设置为false,以便如果用户拖出大方块区域,释放,然后将鼠标移回,则颜色选择器光标赢了“ t“跳转”到鼠标并按照它(因为_isMouseDown仍然是true)。但是,当光标鼠标快速移动时,MouseLeave事件似乎也会触发,导致颜色选择器光标“被丢弃”。

以下代码足以复制问题。尝试快速拖动鼠标,椭圆将“掉落”。删除MouseLeave事件后,问题就会消失。有没有办法解决这个“丢弃”问题,但仍然有我上面提到的行为?

XAML:

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Canvas x:Name="LayoutRoot" Width="800" Height="600">
        <Rectangle Width="800" Height="600" MouseLeftButtonDown="TestMouseDown"
            MouseLeftButtonUp="TestMouseUp" MouseMove="TestMouseMove"
            MouseLeave="TestMouseLeave">
            <Rectangle.Fill>
                <LinearGradientBrush>
                    <GradientStop Offset="0.00" Color="Crimson" />
                    <GradientStop Offset="1.00" Color="Azure" />
                </LinearGradientBrush>
            </Rectangle.Fill>
        </Rectangle>
        <Ellipse Name="TestEllipse" Width="50" Height="50" Fill="Green" />
    </Canvas>
</UserControl>

C#codebehind:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace SilverlightApplication1
{
    public partial class MainPage : UserControl
    {
        private bool _isMouseDown;

        public MainPage()
        {
            InitializeComponent();
        }

        private void TestMouseDown(object sender, MouseButtonEventArgs e)
        {
            _isMouseDown = true;
            UpdatePosition(e.GetPosition(LayoutRoot));
        }

        private void TestMouseUp(object sender, MouseButtonEventArgs e)
        {
            _isMouseDown = false;
        }

        private void TestMouseMove(object sender, MouseEventArgs e)
        {
            if (_isMouseDown)
                UpdatePosition(e.GetPosition(LayoutRoot));
        }

        private void TestMouseLeave(object sender, MouseEventArgs e)
        {
            _isMouseDown = false;
        }

        private void UpdatePosition(Point point)
        {
            Canvas.SetLeft(TestEllipse, point.X);
            Canvas.SetTop(TestEllipse, point.Y);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您应该查看UIElement上的CaptureMouse方法。在这种情况下它应该对你有所帮助。捕获鼠标后,即使鼠标离开元素区域,您仍将继续接收鼠标事件。然后,您可以在适当的时候自愿释放鼠标捕获。

答案 1 :(得分:1)

  

然而,MouseLeave事件也是如此   当光标是鼠标时似乎会触发   快速移动,导致了   颜色选择器光标被“丢弃”。

代码的问题是MouseLeave事件不仅在鼠标离开矩形时触发,当鼠标进入Ellipse时也会触发..因为鼠标事件现在被路由到椭圆控件..(不是这个被触发当你快速移动鼠标时.. ..

正如KeithMahoney建议的那样,你可以试试CaptureMouse ...或者在椭圆的MouseEnter事件上设置_isMouseDown = true ..它可能有用..我测试你的代码了......只是通过看代码告诉你...

答案 2 :(得分:0)

我遇到了类似的问题,就像你一样,我也从鼠标事件中更改了控件的Canvas.LeftCanvas.Top

问题是,当我改变控件的位置时,我将“控制”“移动”在鼠标下方,将焦点放在该控件上,然后又为当前控件引起了MOUSE-LEAVE事件。

考虑将您操作的控件的IsHistTestVisible切换为“FALSE”,这样如果将其移动到鼠标光标的当前位置下方,则不会触发任何新事件。

可以找到完整的解决方案和示例here

https://stackoverflow.com/a/13265880/1308645

我希望有所帮助。

此致 马丁