2012-06-22 1 views
1

Je travaille actuellement sur une sorte d'outil de traitement d'image qui contiendra certains outils de sélection. Pour afficher la sélection en cours à l'utilisateur (par exemple un cercle) trois événements sont utilisés (tout à l'intérieur d'une certaine toile):C# - WPF - Déterminer la position de la souris dans la toile ne fonctionne que sur les formes

public MainWindow() 
{   
    InitializeComponent(); 
} 

private Ellipse _ellip = new Ellipse(); 
private Point _p = new Point(); 
private bool _mouse = false; 
private double _xcor, _ycor; 

private void mouseDown(object sender, MouseButtonEventArgs e) 
{ 
    _p = Mouse.GetPosition(canvas1); 
    _xcor = _p.X; 
    _ycor = _p.Y; 
    _mouse = true; 
} 

private void newPos(object sender, MouseEventArgs e) 
{ 

    if (mouse) 
    { 
     _ellip.Visibility = Visibility.Visible; 
     _p = Mouse.GetPosition(canvas1); 
     _ellip.Margin = new Thickness((_xcor + _p.X)/2 - Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y))/2, (_ycor + _p.Y)/2 - Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y))/2, 0, 0); 
     ellip.Height = Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y)); 
     ellip.Width = Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y)); 
    } 

    InvalidateVisual(); 
} 

private void mouseUp(object sender, MouseButtonEventArgs e) 
{ 
    mouse = false; 
    ellip.Visibility = Visibility.Hidden; 
} 

Cela fonctionne tout va bien à une condition: il y a une sorte de forme derrière le cercle. D'une manière ou d'une autre, les événements MouseLeftButtonDown/Up et MouseMove ne sont pas déclenchés s'ils sont utilisés sur une zone vide dans canvas1. Une fois, par exemple, créer un rectangle remplissant la toile, tout fonctionne très bien. Mais cela pose un autre problème: si le rectangle est plus grand que la toile, il sort de la toile et les événements fonctionnent aussi à l'extérieur de la toile (aussi longtemps qu'il est sur le rectangle). Je ne comprends vraiment pas ce qui ne va pas ici.

Répondre

1

Les actions du bouton de la souris sont reconnues par WPF uniquement si le test d'atteinte indique qu'il y a "quelque chose" sous le pointeur de la souris. Par conséquent, vous devez implémenter HitTestCore(PointHitTestParameters) sur votre canevas.

Voici une explication sur la façon de remplacer le test de déclenchement par défaut: http://msdn.microsoft.com/en-us/library/ms752097.aspx#overriding_default_hit_testing.

+0

Merci, je vais probablement aller avec le pinceau de fond. Je n'ai vraiment pas pensé à ça. Fonctionne parfaitement bien maintenant! Je vais toujours chercher le HitTestCore, merci pour le lien! – phil13131

Questions connexes