2011-10-14 20 views
12

私は自分のカスタムチャートコントロールを実行しました。カーソルの後に単純な十字を描きたいと思います。チャートはCanvas上のPolyLineとして実装されており、CanvasのOnMouseMoveイベントで座標を変更する2行を描画しています。WPFでOnMouseMoveがキャンバスに表示されない

サプライズイベントのみ各10秒MainGUIスレッドがアイドル状態にあるので、イベントを呼び出されることが判明した(UIは完全に応答し、私はアプリケーションを一時停止した場合、メインスレッドは、App mainForm.ShowDialog())である。

?。

私はONMOUSEMOVEまたはPreviewOnMouseMoveを使用して同じパフォーマンスをこの出来事取得された理由を見つける方法上の任意のアイデア

編集:これは私がONMOUSEMOVEそれだけにブレークポイントを置く場合、私はとにかく(クロスを描く方法です時々停止する)

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

カスタムのカーソルを定義することはできません。追加の図面を作成して "擬似"しようとしませんか? –

+0

だから、パフォーマンス上の問題はありませんが、イベントは単に呼び出されていないという問題があります。私はこの権利を理解していますか? –

+0

|ダニエル:十字架が描かれていると呼ばれますが、10秒ごとに1回更新される可能性があります。 –

答えて

23

これは奇妙であると私はなぜ知らない...

FrameworkElement.MouseMove作品のみの領域は、いくつかの明示的な背景ブラシ\フィルが設定されている場合。

あなたのケースではCanvas.Background="Transparent"を設定するとうまくいくはずです。

これに別の修正はWPF Not sending MouseMove events after CaptureMouse();

HitTestは着色画素とそのフィードバックに依存ので、これはおそらくかもしれない...などもあります。

MSDNでドキュメント化されていないものが多く、多くのUI設計者にとって混乱しています。

+2

私はちょうど2つの言葉を持っています:感謝とWTF ???本当に変だ。誰かがマイクロソフトの欠陥を埋めるべきでしょうか? –

+2

シェイプ、テキストブロックなどのようなキャンバスに子がある場合、そのオブジェクトとキャンバスのマウスイベントが発生します(直接のイベントなので、子供からバブリングしてキャンバスに到達しません) 。これは非常に奇妙です。 – Batibix

+2

これは 'Grid'にも当てはまります。 – Stefan

関連する問題