Question

Je réponds à MouseLeftButtonDown événements sur les éléments ajoutés à une toile WPF. Tout fonctionne très bien quand on clique dessus (à savoir le eventhandler Déclenché correctement), mais il nécessite trop de précision du pointeur de la souris. Vous devez être parfaitement au-dessus du cercle pour le faire fonctionner. Je besoin d'être un peu plus indulgent; peut-être au moins 1 ou 2 pixles pardonner. Les éléments sur la toile sont beaux grands cercles (environ la taille d'un quart à l'écran), de sorte que les cercles eux-mêmes ne sont pas trop petits, mais le strokeWidth de chacun est 1, donc il est une fine ligne.

Vous pouvez voir ici une capture d'écran: http://twitpic.com/1f2ci/full

La plupart des graphiques app sont pas pointilleux sur la cueillette de la souris, donc je veux donner à l'utilisateur une expérience familière.

Comment puis-je le rendre un peu plus clément.

Était-ce utile?

La solution

Vous pouvez brancher à l'événement MouseLeftButtonDown de votre objet de mise en page de la racine au lieu et vérifier quels éléments est à portée d'un clic en faisant ceci:

List<UIElement> hits = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(Point, yourLayoutRootElement) as List<UIElement>;  

http://msdn.microsoft.com/ fr-fr / bibliothèque / cc838402 (VS.95) .aspx

Pour le paramètre Point, vous pouvez utiliser le paramètre MouseEventArgs e et appeler sa méthode GetPosition comme ceci:

Point p = e.GetPosition(null)

Je ne me souviens pas si vous souhaitez utiliser HitTest au lieu des FindElementsInHostCoordinates. Essayez les deux.
http://msdn.microsoft.com/en-us/library/ms608752. aspx

Vous pouvez créer 4 objets Point de la position de la souris pour créer un effet de tolérence faux et appeler soit FindElementsInHostCoordinates ou HitTest pour tous les 4 points.

Autres conseils

Vous pouvez essayer de remplir le cercle avec la couleur transparente pour faire toute la cliquable cercle ...

Si cela échoue, vous pouvez également dessiner des cercles d'aide sur le même endroit que les autres cercles. Faire de la couleur de premier plan cercle transparent et faire l'épaisseur de la brosse quelques pixels plus large pour une région cliquable plus acceptable autour du cercle ..

Hope this helps!

Je pense que je l'ai fait (avec vous aider à me lancer) ...

D'abord, je me suis déplacé l'événement de déplacement de manutention au lieu de chaque toile Ellipse. C'est bon et mauvais, du point de vue de la POO. Au moins, quand la gestion des événements de la souris est une responsabilité de l'HolePattern de mettre sur place chaque trou (l'ellipse qui est le visuel du trou), il est extrait loin de sorte que tout consommateur de mon HolePattern obtiendra ce functioanality Automactically. Cependant, en le déplaçant vers le code principal de l'interface utilisateur, je suis maintenant affaire à ma toile événement de souris à un niveau supérieur. Mais ce n'est pas mal non plus. Nous pourrions discuter de cette partie pendant des jours.

Le point est, j'ai conçu un moyen de créer une « marge d'erreur » lors de la cueillette quelque chose sur une toile avec une souris, puis lire le trou que l'Ellipse choisi appartient, et je peux lire le HolePattern que le trou appartient, et toute mon interface utilisateur (ListView, zones de texte, gridview fo coordonnées) sont tous mis à jour par la liaison XAML existante, et la toile est mis à jour avec un appel à une méthode existante pour régénérer la toile.

Pour être honnête, je ne peux pas croire que je l'ai pensé tout ça (avec votre aide et d'autres aussi, bien sûr). Il est un tel sentiment cool d'avoir la vision de ce présent et de voir venir à être.

Consultez le code principal ici:

void canvas1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    int ClickMargin = 2;
    Point ClickedPoint = e.GetPosition(canvas1);
    Point p1 = new Point(ClickedPoint.X - ClickMargin, ClickedPoint.Y - ClickMargin);
    Point p2 = new Point(ClickedPoint.X - ClickMargin, ClickedPoint.Y + ClickMargin);
    Point p3 = new Point(ClickedPoint.X + ClickMargin, ClickedPoint.Y + ClickMargin);
    Point p4 = new Point(ClickedPoint.X + ClickMargin, ClickedPoint.Y - ClickMargin);
    var PointPickList = new Collection<Point>();
    PointPickList.Add(ClickedPoint);
    PointPickList.Add(p1);
    PointPickList.Add(p2);
    PointPickList.Add(p3);
    PointPickList.Add(p4);

    foreach (Point p in PointPickList)
    {
        HitTestResult SelectedCanvasItem = System.Windows.Media.VisualTreeHelper.HitTest(canvas1, p);
        if (SelectedCanvasItem.VisualHit.GetType() == typeof(Ellipse))
        {
            var SelectedEllipseTag = SelectedCanvasItem.VisualHit.GetValue(Ellipse.TagProperty);
            if (SelectedEllipseTag!=null &&  SelectedEllipseTag.GetType().BaseType == typeof(Hole))
            {
                Hole SelectedHole = (Hole)SelectedEllipseTag;
                SetActivePattern(SelectedHole.ParentPattern);
                SelectedHole.ParentPattern.CurrentHole = SelectedHole;

            }
        }
    }
}

Juste Augmenter l'épaisseur du trait de l'Ellipse de sorte qu'il est réglable

donc les œuvres d'événements MouseLeftButtonDown Exemple: Dans la balise Ellipse:

Ellipse  Canvas.Left = "10" Canvas.Top = "133" height = "24" Name = "ellipse1" width = "23" Course = "rouge" MouseLeftButtonDown = "ellipse1_MouseLeftButtonDown" tooltip = "Temp Close" StrokeEndLineCap = "Flat" StrokeThickness = "12"

private void ellipse1_MouseLeftButtonDown (expéditeur d'objet, MouseButtonEventArgs e)         {             Demande CURAPP = Application.Current;             curApp.Shutdown ();         }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top