我正在尝试在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);
}
}
}
答案 0 :(得分:2)
您应该查看UIElement上的CaptureMouse方法。在这种情况下它应该对你有所帮助。捕获鼠标后,即使鼠标离开元素区域,您仍将继续接收鼠标事件。然后,您可以在适当的时候自愿释放鼠标捕获。
答案 1 :(得分:1)
然而,MouseLeave事件也是如此 当光标是鼠标时似乎会触发 快速移动,导致了 颜色选择器光标被“丢弃”。
代码的问题是MouseLeave事件不仅在鼠标离开矩形时触发,当鼠标进入Ellipse时也会触发..因为鼠标事件现在被路由到椭圆控件..(不是这个被触发当你快速移动鼠标时.. ..
正如KeithMahoney建议的那样,你可以试试CaptureMouse ...或者在椭圆的MouseEnter事件上设置_isMouseDown = true ..它可能有用..我测试你的代码了......只是通过看代码告诉你...
答案 2 :(得分:0)
我遇到了类似的问题,就像你一样,我也从鼠标事件中更改了控件的Canvas.Left
和Canvas.Top
。
问题是,当我改变控件的位置时,我将“控制”“移动”在鼠标下方,将焦点放在该控件上,然后又为当前控件引起了MOUSE-LEAVE事件。
考虑将您操作的控件的IsHistTestVisible
切换为“FALSE”,这样如果将其移动到鼠标光标的当前位置下方,则不会触发任何新事件。
可以找到完整的解决方案和示例here
https://stackoverflow.com/a/13265880/1308645
我希望有所帮助。
此致 马丁