2011-10-14 8 views
12

He hecho mi control de gráfico personalizado y quiero dibujar una cruz simple siguiendo el cursor. El gráfico se implementa como una línea poligonal sobre un lienzo y dibujo dos líneas cambiando sus coordenadas en el evento OnMouseMove del lienzo.OnMouseMove no dispara en lienzo en WPF

La sorpresa fue encontrado que el evento de ser llamado sólo cada 10 segundos aproximadamente evento cuando el hilo MainGUI está inactivo (la interfaz de usuario es totalmente sensible y si detengo la aplicación del hilo principal está en la App mainForm.ShowDialog()).

?.

Alguna idea sobre cómo encontrar qué sucede esto me da el mismo rendimiento utilizando el OnMouseMove o la PreviewOnMouseMove

EDIT: esta es la forma en que pinto la cruz (de todas formas si pongo un punto de interrupción en el OnMouseMove sólo se detiene de vez en cuando).

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

¿No podría definir un cursor personalizado, en lugar de intentar hacer un dibujo adicional para "falsificar" uno? –

+0

Entonces, no tiene un problema de rendimiento, pero el problema es que el evento simplemente no se está convocando, ¿entiendo esto bien? –

+0

| Daniel: Se llama porque la cruz está pintada, pero se actualiza quizás una vez cada 10 segundos más o menos. –

Respuesta

23

Esto es extraño y no sé por qué ...

FrameworkElement.MouseMove sólo funciona si la región tiene algunos antecedentes Conjunto de cepillo \ fill explícita.

En su caso, configure Canvas.Background="Transparent", debería funcionar.

Hay otra solución a este, así ... WPF Not sending MouseMove events after CaptureMouse();

Esto podría ser posiblemente porque el HitTest depende de píxeles de colores y sus comentarios.

Sea lo que sea, es algo que no está documentado en MSDN y es confuso para muchos diseñadores de UI.

+2

Solo tengo dos palabras: GRACIAS y WTF ??? Muy raro. Alguien debería llenar un defecto en Microsoft ¿verdad? –

+2

Si hay un niño en el lienzo, como una forma, bloque de texto o lo que sea, los eventos del mouse se disparan para ese objeto Y el lienzo (son eventos directos, por lo que no llegan al lienzo haciendo borbotear entre los niños) . Esto es realmente extraño. – Batibix

+2

Esto también se aplica a una 'Grilla'. – Stefan