2009-08-14 95 views
1

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

以下代码足以重现此问题。尝试快速拖动鼠标,椭圆将被“丢弃”。当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); 
     } 
    } 
} 

回答

2

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

1

然而MouseLeave事件也 似乎火的时候,光标鼠标 快速移动,导致 颜色选择器光标是“下降”。

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

由于KeithMahoney建议,你可以尝试CaptureMouse ...或者在椭圆的MouseEnter事件上设置_isMouseDown = true ..它可以工作..我dint测试你的代码然后..只看到代码告诉你...

0

我有一个类似的问题,就像你,我也改变了Canvas.LeftCanvas.Top从我的鼠标事件控制。

事情是,当我改变控件的位置时,我将控件的“下方”移动到鼠标上,将焦点放在该控件上,然后导致当前控件的MOUSE-LEAVE事件。

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

一个完整的解决方案,例如,可以发现here

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

我希望帮助。

Regards, Martin