2009-08-14 2 views
1

Я пытаюсь сделать подборщик цветов в 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); 
     } 
    } 
} 

ответ

2

Вы должны взглянуть на CaptureMouse метода на UIElement. Это должно быть полезно для вас в этой ситуации. При захваченной мыши вы будете продолжать получать события мыши, даже когда мышь покинет область элемента. Затем вы можете добровольно освободить захват мыши всякий раз, когда это уместно.

1

Однако событие MouseLeave также кажется, срабатывает, когда курсор мыши перемещается быстро, в результате чего в выбора цвета курсора быть «упал».

проблема с вашим кодом является MouseLeave пожаров события не только в то время, мыши оставив прямоугольник, это также срабатывает, когда мышь ввести Эллипс .. потому что событие мыши теперь направляется на управление эллипсом .. (это не срабатывает, когда вы быстро перемещаете мышь).

Как KeithMahoney предлагает, вы можете попробовать CaptureMouse ... или установить _isMouseDown = true на событие MouseEnter для эллипса .. это может сработать .. i dint test ur code все же ... просто говоря, посмотрев код ...

0

У меня была схожая проблема, и, как и вы, я также изменил Canvas.Left и Canvas.Top элемента управления из событий мыши.

Дело в том, что когда я изменил положение элемента управления, я «переместил» этот элемент управления «под» мышью, вместо этого сосредоточив внимание на этом элементе управления, что, в свою очередь, вызвало событие MOUSE-LEAVE для текущего элемента управления ,

Рассмотрите возможность переключения IsHistTestVisible на «FALSE» для управления, которым вы управляете, чтобы, если вы переместите его под текущее местоположение курсора мыши, оно не вызывает никаких новых событий.

Комплексное решение и пример можно найти here

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

Я надеюсь, что помогает.

С уважением, Martin