我正在尝试在Silverlight中制作一个类似于this one的颜色选择器,但在大的正方形区域中实现光标时遇到了问题。为了跟踪鼠标状态,我有一个_isMouseDown变量。在MouseLeave事件上,_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);
}
}
}发布于 2009-08-14 05:22:39
您应该看看UIElement上的CaptureMouse方法。在这种情况下,它应该会对您有所帮助。捕获鼠标后,即使鼠标离开元素的区域,您也会继续接收鼠标事件。然后,您可以在适当的时候自愿释放鼠标捕获。
发布于 2009-08-14 07:22:56
但是,当鼠标快速移动时,似乎也会触发MouseLeave事件,从而导致颜色选择器光标被“丢弃”。
代码的问题是,MouseLeave事件不仅在鼠标离开矩形时触发,在鼠标进入椭圆时也会触发。因为鼠标事件现在被路由到椭圆控件..(当您快速移动鼠标时不会触发此命令)..
正如KeithMahoney建议的那样,您可以尝试CaptureMouse...或者在椭圆的MouseEnter事件上设置_isMouseDown = true。这可能行得通..我还没有测试你的代码..只是通过查看代码来告诉你。
发布于 2012-11-07 16:43:54
我也遇到过类似的问题,就像您一样,我也从鼠标事件中更改了控件的Canvas.Left和Canvas.Top。
问题是,当我更改控件的位置时,我将该控件“移动”到鼠标“下面”,将焦点放在该控件上,这反过来会导致当前控件的鼠标离开事件。
考虑将您操作的控件的IsHistTestVisible切换为"FALSE“,这样当您将其移动到鼠标光标当前位置的下方时,就不会触发任何新事件。
可以在here中找到完整的解决方案和示例
https://stackoverflow.com/a/13265880/1308645
我希望这能有所帮助。
问候你,马丁
https://stackoverflow.com/questions/1275901
复制相似问题