2011-10-14 13 views
12

ho fatto il mio controllo grafico personalizzato e voglio disegnare un semplice cross del cursore. Il grafico è implementato come un PolyLine su una tela e sto disegnando due linee che cambiano le loro coordinate nell'evento OnMouseMove della tela.OnMouseMove non si attiva su tela in WPF

La sorpresa è stata di fondare che l'evento vengono chiamati solo ogni 10 secondi o giù di lì evento quando il thread MainGUI è inattivo (l'interfaccia utente è completamente reattivo e se mi fermo l'applicazione il thread principale è su App mainForm.ShowDialog()).

?.

Qualche idea su come trovare perché sta succedendo questo ho le stesse prestazioni utilizzando l'OnMouseMove o PreviewOnMouseMove

EDIT: questo è come io dipingo la croce (in ogni caso se metto un punto di interruzione al solo OnMouseMove si ferma di tanto in tanto)

XAML:.

<Border BorderThickness="1" BorderBrush="White" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Grid.ColumnSpan="2" > 
    <Canvas x:Name="DrawArea" PreviewMouseMove="DrawArea_PreviewMouseMove" /> 
</Border> 

CS:

public Chart() 
{ 
    _line = new Polyline(); 
    _line.Stroke = Brushes.Orange; 
    _crossX = new Line(); 
    _crossY = new Line(); 
    _crossX.Stroke = Brushes.Orange; 
    _crossY.Stroke = Brushes.Orange; 
    _crossX.StrokeThickness = 1; 
    _crossY.StrokeThickness = 1; 

    InitializeComponent(); 

    this.DrawArea.Children.Add(_line); 
    this.DrawArea.Children.Add(_crossX); 
    this.DrawArea.Children.Add(_crossY); 
}  

private void DrawArea_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point mousePosition = System.Windows.Input.Mouse.GetPosition(this.DrawArea); 

    _crossX.X1 = 0; 
    _crossX.X2 = this.DrawArea.ActualWidth; 
    _crossX.Y1 = _crossX.Y2 = mousePosition.Y; 

    _crossY.Y1 = 0; 
    _crossY.Y2 = this.DrawArea.ActualHeight; 
    _crossY.X1 = _crossY.X2 = mousePosition.X; 
} 
+0

Non si può definire un cursore personalizzato, piuttosto che cercare di eseguire un disegno aggiuntivo per "falso"? –

+0

Quindi, non si ha un problema di prestazioni, ma il problema è che l'evento semplicemente non viene chiamato - ho capito bene? –

+0

| Daniel: Si chiama perché la croce è dipinta ma viene aggiornata forse 1 volta ogni 10 secondi circa. –

risposta

23

Questo è strano e non so perché ... solo

FrameworkElement.MouseMove lavori se la regione ha qualche esplicito sfondo spazzola \ fill set.

Nel tuo caso impostare la Canvas.Background="Transparent", dovrebbe funzionare.

C'è un'altra soluzione a questo pure ... WPF Not sending MouseMove events after CaptureMouse();

Questo potrebbe essere forse perché il HitTest dipende pixel colorati e il loro feedback.

Qualunque cosa sia, la sua qualcosa che non documentate su MSDN ed è fonte di confusione per molti designer dell'interfaccia utente.

+2

Ho solo due parole: GRAZIE e WTF ???? Molto strano. Qualcuno dovrebbe colmare un difetto a Microsoft, giusto? –

+2

Se c'è un bambino sulla tela, come una forma, un blocco di testo o qualsiasi altra cosa, gli eventi del mouse vengono attivati ​​per quell'oggetto E la tela (sono eventi diretti, quindi non raggiungono la tela ribollendo dai bambini) . Questo è davvero strano. – Batibix

+2

Questo vale anche per una 'Grid'. – Stefan

Problemi correlati