4

希望任何人都可以阐明这一点,以便我可以使用带有破折号图案的笔?

我正在使用 WPF 中的X编写一个可滚动的图表(实现的Panel内部) 。我有几千个s 可以通过在托管它们的 s 上使用来滚动。我通过在其顶部放置一个网格并使用//(注意:这些线始终是静态的,它们从不移动)从一个边缘到另一个边缘绘制简单的水平线来实现一个网格。ScrollViewerIScrollInfoDrawingVisualDataContext.DrawDrawingVisualTranslateTransformPanelPanelDataContext.DrawLine(pen, new Point(0, y), new Point(widthOfPanel, y));

滚动性能绝对是疯狂的(即 DrawingVisual 是即时绘制的,滚动是即时的)。但是如果我使用一个Pen使用破折号模式(例如见下文)来绘制网格线,那么滚动非常不稳定,并且性能似乎已经降低了 100 倍(估计值)。谁能解释为什么会发生这种情况以及我如何解决这个问题?

带有破折号图案的笔示例:

<Pen x:Key="PenUsingDashPatterns" Brush="Black" Thickness="1">
   <Pen.DashStyle >
      <DashStyle Dashes="3, 3" />
   </Pen.DashStyle>
</Pen>
4

4 回答 4

6

这是一个可能的解决方法 - 如果您只绘制水平线和/或垂直线,您可以尝试Pen使用棋盘格图案创建您的,DrawingBrush例如:

  <Pen x:Key="PenUsingDashPatterns" Thickness="1">
        <Pen.Brush>
            <DrawingBrush TileMode="Tile" 
                          Viewport="0 0 6 6" ViewportUnits="Absolute">
                <DrawingBrush.Drawing>
                    <GeometryDrawing Brush="Black">
                        <GeometryDrawing.Geometry>
                            <GeometryGroup>
                                <RectangleGeometry  Rect="0 0 3 3"/>
                                <RectangleGeometry  Rect="3 3 3 3"/>
                            </GeometryGroup>
                        </GeometryDrawing.Geometry>
                    </GeometryDrawing>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </Pen.Brush>
    </Pen>   

或者,您可以对垂直和水平线使用不同的画笔,或者可能使用ImageBrush更好的性能。

于 2009-04-13T16:48:22.727 回答
3

钢笔结冰了吗?冻结绘图对象对性能有很大帮助。

您可以设置一个 Loaded 处理程序并调试以查看您的笔是否被冻结。如果没有,请在它们上手动调用 Pen.Freeze() 按钮。

请注意,冻结也会使笔成为只读...冻结后您将无法修改它们。

于 2009-02-11T18:58:24.620 回答
3

您应该使用 Perforator 来深入研究性能问题。这是 MSDN 站点的链接,其中讨论了各种WPF 性能工具。Perforator 可能是最能帮助您的工具,特别是在确定是否使用软件渲染器绘制线条时(这将是导致性能如此糟糕的最大因素)。

如果问题是它们是在软件中绘制的,您可能必须编写自己的ShaderEffect,但这可能会很快变得棘手,除非您熟悉 HLSL。

于 2009-04-13T15:31:26.780 回答
2

这很可能是因为这个特定的绘制操作不能委托给视频卡,这将强制在内存中进行合成并将 blitting 到视频卡。

于 2009-04-08T14:58:49.157 回答