OnMouseMove does not fire on canvas in WPF

后端 未结 2 1607
时光说笑
时光说笑 2020-12-16 14:45

I have done my custom chart control and I want to draw a simple cross following the cursor. The chart is implemented as a PolyLine over a Canvas and I\'m drawing two lines c

相关标签:
2条回答
  • 2020-12-16 15:18

    This is wierd and I dont know why...

    FrameworkElement.MouseMove works only if the region has some explicit background brush \ fill set.

    In your case set the Canvas.Background="Transparent", it should work.

    There is another fix to this as well... WPF Not sending MouseMove events after CaptureMouse();

    This could be possibly because the HitTest depends upon colored pixels and their feedback.

    Whatever it is, its something not documented over MSDN and is confusing for many UI designers.

    0 讨论(0)
  • 2020-12-16 15:27

    I ended up in writing a mouse global mouse handler like this:

    using System.Windows.Interop;
    
    private const int WM_MOUSEMOVE = 0x0200;
    public delegate void Del_MouseMovedEvent(Point mousePosition);
    
    // Relative to this control, the mouse position will calculated
    public IInputElement Elmt_MouseMovedRelativeElement = null;
    
    // !! This is static; needs special treatment in a multithreaded application !!
    public static event Del_MouseMovedEvent Evt_TheMouseMoved = null;
    
    // your main function call
    public MyMainWindows()
    {
        // install the windows message filter first
        ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage;
    
        InitializeComponent();
    
        ...
    }   
    
    // filtering the windows messages
    private void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled)
    {
        if(msg.message == WM_MOUSEMOVE)
        {
            this.Evt_TheMouseMoved?.Invoke(Mouse.GetPosition(this.Elmt_MouseMovedRelativeElement));
        }
    }
    
    // individual event for mouse movement
    private void MyMouseMove(Point mousePoint)
    {
        // called on every mouse move when event is assigned
        Console.WriteLine(mousePoint.X + " " + mousePoint.Y);
    }
    
    private void AnyFunctionDeeperInTheCode()
    {
        // assign the handler to the static var of the main window
        MyMainWindows.Evt_TheMouseMoved += MyMouseMove;
    
        // set the element / control to which the mouse position should be calculated; 
        MyMainWindows.Elmt_MouseMovedRelativeElement = this;
    
        ...
    
        // undassign the handler from the static var of the main window
        MyMainWindows.Evt_TheMouseMoved -= MyMouseMove;
    }
    
    0 讨论(0)
提交回复
热议问题