Domanda

Sto rispondendo a MouseLeftButtonDown eventi su elementi aggiunti a una tela WPF. Tutto funziona bene quando si fa clic (vale a dire l'EventHandler spara correttamente), ma richiede troppa precisione dal puntatore del mouse. Devi essere perfettamente sulla parte superiore del cerchio per farlo funzionare. Ho bisogno di essere un po 'più clemente; forse almeno 1 o 2 pixles perdonare. Gli elementi sulla tela sono belle grandi cerchi (circa le dimensioni di un quarto sullo schermo), quindi i cerchi stessi non sono troppo piccole, ma la StrokeWidth di ognuno è 1, quindi è una linea sottile.

È possibile vedere uno screenshot qui: http://twitpic.com/1f2ci/full

La maggior parte grafica app non sono questo schizzinosi riguardo la raccolta del mouse, quindi voglio dare all'utente un'esperienza familiare.

Come posso rendere un po 'più clemente.

È stato utile?

Soluzione

È possibile collegare al caso MouseLeftButtonDown del vostro oggetto layout di root invece, e verificare quali elementi si trova nel raggio di un clic in questo modo:

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

http://msdn.microsoft.com/ it-it / library / cc838402 (VS.95) aspx

Per il parametro Point, è possibile utilizzare il parametro MouseEventArgs e, e chiamare il suo metodo getPosition in questo modo:

Point p = e.GetPosition(null)

Non riesco a ricordare se utilizzare HitTest al posto delle FindElementsInHostCoordinates. Prova entrambi.
http://msdn.microsoft.com/en-us/library/ms608752. aspx

È possibile creare 4 oggetti punto dalla posizione del mouse per creare un effetto di tolleranza falso, e chiamare sia FindElementsInHostCoordinates o HitTest per tutti e 4 punti.

Altri suggerimenti

Si potrebbe voler cercare di riempire il cerchio con il colore trasparente per rendere l'intero cerchio cliccabile ...

Se non funziona, è anche possibile disegnare dei cerchi di supporto sulla stessa posizione degli altri circoli. Rendere il cerchio di colore di primo piano trasparente, e rendere lo spessore del pennello qualche pixel più ampio per una regione cliccabile più accettabile intorno al cerchio ..

Spero che questo aiuti!

Credo che ho fatto (con voi aiuto per ottenere mi ha iniziato) ...

In primo luogo, ho spostato la gestione alla tela al posto di ogni Ellisse evento move. Questo è un bene e il male, dal punto di vista OOP. Almeno quando la gestione degli eventi del mouse è una responsabilità del HolePattern per impostarlo su un massimo ogni buca (l'ellisse che è la visuale del foro), che si astrae via in modo che tutti i consumatori del mio HolePattern otterrà questo functioanality automactically. Tuttavia, spostandolo al codice principale dell'interfaccia utente, ora mi occupo di mia tela evento del mouse a un livello superiore. Ma non è tutto male. Potremmo discutere di questa parte per giorni.

Il punto è, Ho progettato un modo per creare un "margine di errore" quando raccogliere qualcosa su una tela con un mouse, e quindi leggere il foro che l'ellisse selezionata appartiene, e quindi posso leggere il HolePattern che il foro appartiene, e tutta la mia UI (ListView, caselle di testo, gridview fo coordinate) sono tutti aggiornati dal XAML esistente vincolante, e la tela viene aggiornato con una chiamata a un metodo esistente per rigenerare la tela.

Per essere onesti, non riesco a credere che ho capito tutto questo fuori (con il vostro aiuto e anche altri, ovviamente). È una sensazione così bello avere la visione di questo questo e vederlo venuto per essere.

Scopri il codice principale qui:

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;

            }
        }
    }
}

solo aumentare Stroke spessore del Ellipse in modo che sia regolabile

quindi le opere di eventi MouseLeftButtonDown Esempio: Nel tag Ellisse:

Ellisse  Canvas.Left = "10" Canvas.Top = "133" height = Nome "24" = "ellipse1" width = Stroke "23" = "Red" MouseLeftButtonDown = Tooltip "ellipse1_MouseLeftButtonDown" = "Temp Chiudi" StrokeEndLineCap = "Flat" StrokeThickness = "12"

private void ellipse1_MouseLeftButtonDown (object sender, MouseButtonEventArgs e)         {             Applicazione curApp = Application.Current;             curApp.Shutdown ();         }

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top