1

我正在尝试在 Silverlight 中制作一个与此类似的颜色选择器,但我无法在大方形区域中实现光标。为了跟踪鼠标状态,我有一个_isMouseDown变量。OnMouseLeave事件_isMouseDown设置为false,因此如果用户拖出大方形区域,释放,然后将鼠标移回,颜色选择器光标不会“跳”到鼠标并跟随它(因为_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#代码隐藏:

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

3 回答 3

2

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

于 2009-08-14T05:22:38.870 回答
1

然而,当鼠标快速移动光标时,MouseLeave 事件似乎也会触发,从而导致颜色选择器光标“掉落”。

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

正如 KeithMahoney 建议的那样,您可以尝试 CaptureMouse... 或在 ellipse 的 MouseEnter 事件上设置 _isMouseDown = true .. 它可能会起作用.. 我还没有测试您的代码.. 只是通过查看代码告诉您...

于 2009-08-14T07:22:56.383 回答
0

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

问题是,当我更改控件的位置时,我“移动”了该控件“在鼠标下方”,而是将焦点放在该控件上,这反过来又导致了当前控件的 MOUSE-LEAVE 事件。

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

可以在此处找到完整的解决方案和示例

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

我希望这会有所帮助。

问候,马丁

于 2012-11-07T08:43:54.097 回答