Я пытаюсь сделать подборщик цветов в Silverlight похожим на this, но у меня возникли проблемы с реализацией курсора в большой квадратной области. Чтобы отслеживать состояние мыши, у меня есть переменная _isMouseDown
. На событии MouseLeave
_isMouseDown
установлено на false
, так что, если пользователь вытаскивает из большой квадратной области, отпускает и затем перемещает мышь назад, курсор выбора цвета не будет «прыгать» на мышь и следовать ей (потому что _isMouseDown
все равно будет true
). Однако событие MouseLeave
также, похоже, срабатывает, когда курсор мыши перемещается быстро, в результате чего курсор выбора цвета «отбрасывается».Silverlight MouseLeave Issue
Для обеспечения повторной задачи достаточно использовать следующий код. Попробуйте перетащить мышь быстро, и эллипс будет «сброшен». Когда событие 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);
}
}
}