2009-08-14 13 views
1

J'essaie de faire un sélecteur de couleur dans Silverlight semblable à this mais j'ai du mal à implémenter le curseur dans la grande zone carrée. Afin de garder une trace de l'état de la souris, j'ai une variable _isMouseDown. Sur l'événement MouseLeave_isMouseDown est défini sur false, de sorte que si un utilisateur sort de la grande zone carrée, relâche puis déplace la souris, le curseur du sélecteur de couleur ne "sautera" pas à la souris et le suivra (parce que _isMouseDown serait toujours true). Cependant, l'événement MouseLeave semble également se déclencher lorsque le curseur déplace la souris rapidement, ce qui entraîne la suppression du curseur du sélecteur de couleurs.Silverlight MouseLeave Issue

Le code suivant suffit pour répliquer le problème. Essayez de faire glisser la souris rapidement et l'ellipse sera "lâchée". Lorsque l'événement MouseLeave est supprimé, le problème disparaît. Yat-il un moyen de résoudre ce problème de "chute", mais toujours avoir le comportement que j'ai mentionné ci-dessus?

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# behind:

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); 
     } 
    } 
} 

Répondre

2

Vous devriez jeter un oeil à la méthode CaptureMouse sur UIElement. Cela devrait vous être utile dans cette situation. Avec la souris capturée, vous continuerez à recevoir des événements de souris même lorsque la souris quitte la zone de l'élément. Vous pouvez ensuite libérer volontairement la capture de la souris chaque fois que cela est approprié.

1

Cependant l'événement MouseLeave également semble tirer lorsque le curseur est la souris est déplacé rapidement, entraînant le curseur de sélecteur de couleur étant « tombé. »

le problème avec votre code est événement se déclenche MouseLeave non seulement au moment de la souris en laissant le rectangle, ce déclenche également lorsque la souris entrer dans l'Ellipse .. car l'événement de la souris est maintenant dirigé vers le contrôle de l'ellipse .. (Comme le suggère KeithMahoney, vous pouvez essayer CaptureMouse ... ou définir _isMouseDown = true sur l'événement MouseEnter de l'ellipse .. cela peut fonctionner .. i dint test ur code encore .. juste vous dire en voyant le code ...

0

J'ai eu un problème similaire, et tout comme vous, j'ai également changé le Canvas.Left et Canvas.Top d'un contrôle de mes événements de souris. Le fait est que, lorsque j'ai changé la position du contrôle, j'ai "déplacé" ce contrôle "sous" la souris, mettant plutôt l'accent sur ce contrôle, ce qui provoquait un événement MOUSE-LEAVE pour le contrôle en cours . Envisager de basculer le IsHistTestVisible sur "FALSE" pour le contrôle que vous manipulez, de sorte que si vous le déplacez sous l'emplacement actuel du curseur de la souris, il ne déclenche aucun nouvel événement.

Une solution complète et par exemple se trouvent here

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

J'espère que cela aide.

Cordialement, Martin