c# - OnMouseMove 不会在 WPF 中的 Canvas 上触发

标签 c# wpf performance events

我已经完成了自定义图表控件,我想在光标后绘制一个简单的十字。该图表作为 Canvas 上的 PolyLine 实现,我正在绘制两条线,在 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# - OnMouseMove 不会在 WPF 中的 Canvas 上触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7764421/

相关文章:

c# - 基于绑定(bind)数据的 MenuItem 模板更改

c# - 当 c# 中的扬声器没有声音时,如何使用 WasapiLoopbackCapture 录制音频?

c# - 模拟 MembershipUser

c# - 在没有 ASP.Net Core 服务器的情况下使用 SignalR

mysql - 查询优化,我还能做什么?

javascript - 如何重置 “$timeout” 并禁用 “$watch()” ?

linux - 工控机性能: Named Pipe vs Socket

c# - Entity Framework - 如何检查表是否存在?

c# - silverlight 3.0与winforms的通信

wpf - 通过 MVVM 绑定(bind)的 ObservableCollection<T> 不会更新 View