我已经完成了自定义图表控件,我想在光标之后绘制一个简单的十字。该图表被实现为Canvas上的折线,并且我在Canvas的OnMouseMove事件中绘制了两条更改其坐标的线。

令人惊讶的是,当MainGUI线程处于空闲状态时,该事件仅每10秒左右被调用一次(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;
}

最佳答案

这很奇怪,我不知道为什么...
FrameworkElement.MouseMove仅在该区域具有一些显式背景笔刷\填充集时有效。

在您的情况下设置Canvas.Background="Transparent",它应该可以工作。

对此也有另一种解决方法... WPF Not sending MouseMove events after CaptureMouse();

这可能是因为HitTest取决于彩色像素及其反馈。

不管是什么,它都没有在MSDN上进行记录,这对于许多UI设计人员来说都是令人困惑的。

关于c# - 在WPF中OnMouseMove不会在 Canvas 上触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7764421/

10-08 23:02