问题描述:
在UserControl的OnRender事件中,调用drawingContext.DrawLine()方法,绘制背景。代码如下:
protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); Pen pen = new Pen(); pen.Thickness = 1; pen.Brush = Brushes.Red; for (int i = 1; i < 100; i++) { drawingContext.DrawLine(pen, new Point(0, i * 30), new Point(this.ActualWidth, i * 30)); }
得到效果如下(背景色设置成 Background="Transparent"):
然后在页面中添加入两个Path并且添加MouseMove事件
<Grid> <Path x:Name="XFocusLine" Data="M0,1 L1,1" Stroke="Black" VerticalAlignment="Top" HorizontalAlignment="Left" StrokeThickness="1" Stretch="Fill" SnapsToDevicePixels="True" Panel.ZIndex="1000"/> <Path x:Name="YFocusLine" Data="M1,1 L1,1" Stroke="Black" VerticalAlignment="Top" HorizontalAlignment="Left" StrokeThickness="1" Stretch="Fill" SnapsToDevicePixels="True" Panel.ZIndex="1000"/> </Grid> protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); Point point = e.GetPosition(this); XFocusLine.Margin = new Thickness(0, point.Y, 0, 0); YFocusLine.Margin = new Thickness(point.X, 0, 0, 0); }
效果如下:
黑色的十字线跟随者鼠标的移动而移动,运行十分正常,cpu的使用率也不高。
问题来了,如果背景图案的实线改为虚线
Pen pen = new Pen(); pen.Thickness = 1; pen.Brush = Brushes.Red; pen.DashStyle = DashStyles.Dot;
当鼠标移动的时候,CPU的使用率变的特别高。两者之间唯一的差别就是一种情况是实线,一种情况是虚线( pen.DashStyle = DashStyles.Dot;)。
查了一些资料都没有得到答案,不知道哪问高手能够指点一下。
启用GPU加速试一下?
应该知道WPF的绘图功能是与硬件有关的,一般一次显示万个以上的绘制对象,就会出现延迟。
你的这个问题也是因上边的原因造成的。
虽然你绘制的线并不多,但是如果改成虚线显示,对于WPF来说,内部的实现也是每个可见点绘制成一个对象的。
所以,出现延迟是正常的。如果你把虚线的点改的长一点,延迟就会好一点。这也说明了上面的问题。