首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Silverlight MouseLeave问题

Silverlight MouseLeave问题
EN

Stack Overflow用户
提问于 2009-08-14 03:31:52
回答 3查看 1.6K关注 0票数 1

我正在尝试在Silverlight中制作一个类似于this one的颜色选择器,但在大的正方形区域中实现光标时遇到了问题。为了跟踪鼠标状态,我有一个_isMouseDown变量。在MouseLeave事件上,_isMouseDown被设置为false,因此如果用户拖出大的正方形区域,松开鼠标,然后将鼠标移回,颜色选择器光标不会“跳”到鼠标并跟随它(因为_isMouseDown仍然是true)。但是,当鼠标快速移动时,似乎也会触发MouseLeave事件,从而导致颜色选择器光标被“丢弃”。

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

XAML:

代码语言:javascript
复制
<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#代码幕后:

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-14 05:22:39

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

票数 2
EN

Stack Overflow用户

发布于 2009-08-14 07:22:56

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

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

正如KeithMahoney建议的那样,您可以尝试CaptureMouse...或者在椭圆的MouseEnter事件上设置_isMouseDown = true。这可能行得通..我还没有测试你的代码..只是通过查看代码来告诉你。

票数 1
EN

Stack Overflow用户

发布于 2012-11-07 16:43:54

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

问题是,当我更改控件的位置时,我将该控件“移动”到鼠标“下面”,将焦点放在该控件上,这反过来会导致当前控件的鼠标离开事件。

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

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

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

我希望这能有所帮助。

问候你,马丁

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1275901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档